文章目录
- String常用的接口(黑框标记的是常用接口)
- 数据访问
- `operator`:
- `at`:
- `back`:
- `front`:
- 数据修改
- `push_back`:
- `append`:
- `operator`:
- `assigen`:
- `insert`:
- `erase`:
- `replace`:
- ==注意事项==
String常用的接口(黑框标记的是常用接口)
数据访问
operator
:
返回对字符串中位置为pos的字符的引用
at
:
和operator
类似但是有细微不同,都是返回对字符串中位置为pos的字符的引用
void TestString1()
{
string s1("hello world");
cout << s1[3] << endl;
cout << s1.at(3) << endl;
}
二者区别:
区别主要是在访问越界时候的报错
这是operator
的越界报错:
提示字符串下标出超出范围的断言错误
这是at
的越界报错:
只提示调试错误和调试失败用字样
所以我们日常使用时候用operator
的情况居多
back
:
返回对字符串最后一个字符的引用
front
:
返回对字符串第一个字符的引用
这两个了解即可用处不大
void TestString2()
{
string s1("hello world");
char lastchar = s1.back();
char firstchar = s1.front();
cout << lastchar << endl;
cout << firstchar << endl;
}
数据修改
push_back
:
将字符c追加到字符串的末尾,使其长度增加1
void TestString3()
{
string s1("hello world");
cout << s1 << endl;
s1.push_back('!');
cout << s1 << endl;
}
append
:
1.string& append (const string& str);
追加一个str的副本
2.string& append (const string& str, size_t subpos, size_t sublen);
追加一个str的副本。从追加的字符subpos开始,并跨越sublen字符(或者直到str的末尾,如果str太短或者sublen是string::npos)。
3.string& append (const char* s);
在原文本后面添加字符或者字符串
4.string& append (const char* s, size_t n);
在s所指向的字符数组中追加前n个字符的副本
5.string& append (size_t n, char c);
在s所指向的字符数组后面添加n个c字符
6 range
以相同的顺序追加[first,last)范围内字符序列的副本
7.initializer list
以相同的顺序追加il中每个字符的副本
void TestString4()
{
string s1("hello world");
string s2("hello string");
cout << s1 << endl;
s1.append(s2);
cout << s1 << endl;
s1.append(s2,7,6);
cout << s1 << endl;
s1.append(" hello string");
cout << s1 << endl;
s1.append(5,'!');
cout << s1 << endl;
s1.append(++s2.begin(), --s2.end());
cout << s1 << endl;
}
operator
:
通过在当前值的末尾附加额外的字符来扩展字符串(文字形容抽象,看示例直接解锁最爽插入方式)
void TestString5()
{
string s1("hello world");
s1 += ' ';
s1 += "hello";
s1 += ' ';
s1 += "string";
cout << s1 << endl;
}
什么实力不用我多说了吧~~~~~
assigen
:
为字符串赋一个新值,替换其当前内容(简单粗暴的覆盖)(种类太多,最基本的使用方法就是示例给出的)
了解即可,不太常用
void TestString6()
{
string s1("hello world");
cout << s1 << endl;
s1.assign("xxxxxxx");
cout << s1 << endl;
}
insert
:
在字符串中pos(或p)指定的字符前面插入额外的字符(种类太多,最基本的使用方法就是示例给出的)
void TestString7()
{
string s1("hello world");
cout << s1 << endl;
s1.insert(6,"string");
cout << s1 << endl;
}
erase
:
删除字符串的一部分,减少其长度
1.string& erase (size_t pos = 0, size_t len = npos);
擦除字符串值中从字符位置pos开始并跨越len字符的部分(如果内容太短或len为string::npos,则擦除直到字符串末尾)。注意,默认实参会擦除字符串中的所有字符(类似于成员函数clear)
2.iterator erase (iterator p);
擦除指向p的字符
3. iterator erase (iterator first, iterator last)
擦除[first,last)范围内的字符序列
void TestString8()
{
string s1("hello world");
cout << s1 << endl;
s1.erase(0, 5);
cout << s1 << endl;
string s2("hello world");
cout << s2 << endl;
s2.erase(s2.begin(),s2.end());
cout << s2 << endl;
}
replace
:
用新内容替换字符串中从字符pos开始并跨越len字符的部分(或字符串中介于[i1,i2)之间的部分)
坏消息多,好消息用的少,掌握基本用法就行
void TestString9()
{
string s1("hello world");
cout << s1 << endl;
s1.replace(5,1,"100");
cout << s1 << endl;
}
find
:
在字符串中搜索由其参数指定的序列的第一次出现
npos
:
npos
是一个特殊的常量,它表示字符串中不存在的子串或字符的位置。当你在查找字符串中的子串或字符时,如果找不到,函数会返回npos
那么我么将npos
,find
和replace
结合起来:
void TestString10()
{
string s1("h e l l o w o r l d ");
size_t pos = s1.find(" ");
while (pos != string::npos)
{
s1.replace(pos,1,"%d");
pos = s1.find(" ");
}
cout << s1 << endl;
}
实现查找并替换
注意事项
insert
,erase
和replace
能少用就少用,欣慰他们都会挪动数据,效率不高
就比方说上面那个实现查找并替换我们就可以用另一种方式进行编写
void TestString11()
{
string s1("h e l l o w o r l d ");
string s2;
for (auto ch : s1)
{
if (ch != ' ')
{
s2 += ch;
}
else
{
s2 += "%d";
}
}
s1.swap(s2);
cout << s1 << endl;
}