一、介绍
string容器本质上是一个类,string类中封装了一个char *指针,可以理解为string类是一个
char *类型的容器。(有区别于char *,char *类型本质上是一个指针)
问:为什么选择使用string而不是使用char * ?
答:string类提供了许多成员函数:copy、find、delete、replace、insert等,同时封装了对于char * 空间的使用,在函数内部做了必要的异常检查,减少因下标越界等引起的异常发生。
二、string类的初始化
string类提供以下四种构造函数进行初始化:
| string() | 无参构造函数,创造一个空字符串 |
| string(const char* s) | 使用字符串初始化 |
| string(const string& s) | 使用string对象初始化 |
| string(int n, char c) | 使用n个字符c初始化 |
string s0; //初始化为空串
const char* ss = "123456";
string s1(ss); //通过const char *常量初始化
string s2(s1); //字符串初始化
string s3(5, 'W'); //通过5个字符W来初始化
三、string类的使用
3.1 string赋值
string类对象的赋值提供两种方式,分别为利用运算符=与利用assign函数。
3.2.1 利用 运算符= 赋值
string类的运算符=常用的重载有几种方式,如下所示:
| 声明 | 解释 |
| string& operator=(const char *s) | 将char *类型的字符串s赋值给当前字符串 |
| string& operator=(const string &s) | 将字符串s赋值给当前字符串 |
string sourceS("01234");
const char* cs = "56789";
string s0 = cs; //将char *类型的字符串s赋值给当前字符串
string s1 = sourceS;//将字符串s赋值给当前字符串
3.2.2 利用 assign函数 赋值
string类的assign函数常用的重载有几种方式,如下所示:
| 声明 | 解释 |
| string& assign(const char *s) | 将char *类型的字符串s赋值给当前字符串 |
| string& assign(const char *s, int n) | 将char *类型字符串s的前n个字符赋值给当前字符串 |
| string& assign(const string& s) | 将字符串s赋值给当前字符串 |
| string& assign(int n, char c) | 将n个字符c赋值给当前字符串 |
string sourceS("01234");
const char* cs = "56789";
string s0;
s0.assign(cs); //将char *类型的字符串s赋值给当前字符串
s0.assign(cs, 3); //将char *类型字符串s的前n个字符赋值给当前字符串
s0.assign(sourceS); //将字符串s赋值给当前字符串
s0.assign(10, 'X'); //将n个字符'X'赋值给当前字符串
3.2 string拼接
string类对象的拼接提供两种方式,分别为运算符+=和append函数。
3.2.1 利用 运算符+= 拼接
string类的运算符+=常用的重载有几种方式,如下所示:
| 声明 | 解释 |
| string& operator+=(const char *s) | 将char *类型的字符串s拼接在当前字符串的末尾 |
| string& operator+=(char c) | 将字符c拼接在当前字符串的末尾 |
| string& operator+=(const string &s) | 将字符串s拼接在当前字符串的末尾 |
string sourceS("01234");
string s0(sourceS); //利用soruceS初始化s0
s0 += 'W'; //将char *类型的字符串s拼接在s0的末尾
s0 += "123456"; //将字符c拼接在s0的末尾
s0 += sourceS; //将字符串s拼接在s0的末尾
3.2.2 利用 append函数 拼接
string类的append函数常用的重载有几种方式,如下所示:
| 声明 | 解释 |
| string& append(const char *s) | 将char *类型的字符串s拼接在当前字符串末尾 |
| string& append(const char *s, int n) |
将char *类型的字符串s的前n个字符拼接在当前字符串末尾 |
| string& append(const string& s) | 将字符串s拼接在当前字符串末尾 |
| string& append(const string& s, int pos, int n) | ※ 将字符串s从pos开始的n个字符拼接在当前字符串末尾 |
string ss("01234");
const char* cs = "56789";
string s1("WWW");
string s0(ss);//用ss初始化s0,此时s0为:"01234"
s0.append(cs);//将cs拼接在s0末尾,此时s0为:"0123456789"
s0.append(cs, 3);//将cs的前3个字符拼接在s0末尾,此时s0为:"0123456789567"
s0.append(s1);//将s1拼接到s0末尾,此时s0为:"0123456789567WWW"
s0.append(ss, 2, 2);//将s1从下标2开始后的2个字符,也就是"23",拼接到s0末尾,此时s0为:"0123456789567WWW23"
cout << s0 << endl;//输出s0
程序运行结果(s0的输出)为:

3.3 string查找元素
查找string中的某个元素,使用find函数和rfind函数来实现。函数的返回值为元素的下标。
| 声明 | 解释 |
| int find(const string& s, int pos = 0) const |
查找s第一次出现的位置,从pos位置开始查找 |
| int find(const char *s, int pos = 0) const | 查找s第一次出现的位置,从pos位置开始查找 |
| int find(const char *s, int pos, int n) const | 查找s的前n个字符第一次出现的位置,从pos位置开始查找 |
| int find(const char c, int pos = 0) const | 查找字符c第一次出现的位置,从pos位置开始查找 |
| int rfind(const string& s, int pos = 0) const |
查找s最后1次出现的位置,从pos位置开始倒着查找 |
| int rfind(const char *s, int pos = 0) const | 查找s最后1次出现的位置,从pos位置开始倒着查找 |
| int rfind(const char *s, int pos, int n) const |
查找s的前n个字符最后1次出现的位置, 从pos位置开始倒着查找 |
| int rfind(const char c, int pos = 0) const | 查找字符c最后1次出现的位置,从pos位置开始倒着查找 |
string s0("abcABCabc");//初始化后,此时s0为:"abcdeABCDEabcde"
//对应下标:012345678
//查找 string对象"ab"从 下标位置5 出现的第一个位置下标,为6
cout << "Find the first index of (string)\"ab\" : ";
cout << s0.find(string("ab"), 5) << ", 应该为6" << endl;
//查找 char *类型的"bc"从 下标位置5 出现的第一个位置下标,为7
cout << "Find the first index of (char *)\"bc\" : ";
cout << s0.find("bc", 5) << ", 应该为7" << endl;
//查找 char *类型的"abc"的前两个字符(ab),从 下标位置5 出现的第一个位置下标,为6
cout << "Find the first index of (string)\"abc\" : ";
cout << s0.find("abc", 5, 2) << ", 应该为6" << endl;
//查找 字符'c'从 下标位置5 出现的第一个位置下标,为8
cout << "Find the first index of (char *)\'c\' : ";
cout << s0.find('c', 5) << ", 应该为8" << endl;
//查找 string对象"ab"从 下标位置8 出现的最后一次位置下标,为6
cout << "Find the first index of (string)\"ab\" : ";
cout << s0.rfind(string("ab"), 8) << ", 应该为6" << endl;
//查找 char *类型的"bc"从 下标位置8 出现的最后一次位置下标,为7
cout << "Find the first index of (char *)\"bc\" : ";
cout << s0.rfind("bc", 8) << ", 应该为7" << endl;
//查找 char *类型的"abc"的前两个字符(ab),从 下标位置8 出现的最后一次位置下标,为6
cout << "Find the first index of (string)\"abc\" : ";
cout << s0.rfind("abc", 8, 2) << ", 应该为6" << endl;
//查找 字符'c'从 下标位置8 出现的最后一次位置下标,为8
cout << "Find the first index of (char *)\'c\' : ";
cout << s0.rfind('c', 8) << ", 应该为8" << endl;
※注意:没有查找字符串s的前n个函数的位置!!如果存在str类型为string,则:
string s("abcABCabcABC");
string str("ABC");
//从下标位置5,开始找到s中前2字符第一次出现的下标位置,这是错误用法
int index = s.find(str, 5, 2);
※ ※ ※ 以上这种用法是错误的! ※ ※ ※
3.4 string替换元素
string类通过replace函数实现元素的替换:
| 声明 | 解释 |
| string& replace(int pos, int n, const string& str) | 将从pos开始的n个字符替换为str |
| string& replace(int pos, int n, const char *s) | 将从pos开始的n个字符替换为s |
string s0("abcABCabc");//初始化后,此时s0为:"abcdeABCDEabcde"
//对应下标:012345678
string s1("123456789");
s0.replace(3, 3, s1);
//将ABC替换为s1后,s0为abc123456789abc
cout << s0 << endl;
const char* s2 = "ABCDEF";
s0.replace(0, 3, s2);
//将abc123456789abc开头的三个字符替换为s2,结果为ABCDEF123456789abc
cout << s0 << endl;
3.5 string字符串比较
string类通过compare函数两个字符串的比较,所比较的两个字符串的ASCII码值:
| 声明 | 解释 |
| string& compare(const string& str) | 当前字符串与字符串str比较 |
| string&compare(const char *s) | 当前字符串与字符串s比较 |
假设a和b两个字符串比较大小,
从第一个元素开始,比较a和b的第一个元素的ASCII值,a[i]和b[j]分别代表当前元素。
如果a[i] > b[i],则比较返回值为1,比较结束
如果a[i] < b[i],则比较返回值为-1,比较结束
如果a[i] == b[i],比较继续,比较下一组元素。
如果比较到某一个字符串结束,之前的元素都相等,谁还剩余元素,谁就大,比较结束
string s0("abcABCabc");
string s1("abc");
string s2("abcABCabc");
cout << "\"abcABCabc\" 与 \"abc\"比较 : " << s0.compare(s1) << endl; //1
cout << "\"abcABCabc\" 与 \"abcABCabc\"比较 : " << s0.compare(s2) << endl;//0
cout << "\"abc\" 与 \"abcABCabc\"比较 : " << s1.compare(s0) << endl; //-1
3.6 string通过下标访问元素
string类通过下标访问元素的方式有2种:运算符[ ]和at函数。这两种方式可以作为“左值”。
| 声明 | 解释 |
| char& operator[](int index) | 获取当前字符串中下标为index的字符 |
| char& at(int index) | 获取当前字符串中下标为index的字符 |
string s0("abcABCabc");
/*这两种方式可以作为“左值”*/
cout << s0.at(4) << endl;//B
cout << s0[5] << endl;//C
s0.at(4) = 'W';
cout << s0 << endl;//abcAWCabc
s0[4] = 'B';
cout << s0 << endl;//abcABCabc
3.7 string插入元素
string类通过insert函数插入字符串:(插入方式为左插入 ※ ※ )
(左插入:在指定位置的左边插入内容,比如在"abc"下标1的位置插入“WWW”,
下标1对应的是b,也就是在b的左侧插入“WWW”,结果为:"aWWWbc")
| 声明 | 解释 |
| string& insert(int pos, const char *s) | 在下标为pos的位置插入字符串s |
| string& insert(int pos, const string &str) | 在下标为pos的位置插入字符串str |
| string& insert(int pos, int n, char c) | 在下标为pos的位置插入n个字符c |
string s0("abcABCabc");
/*插入方式为“左插入”*/
s0.insert(2, "WWW");
cout << s0 << endl;//abWWWcABCabc
s0.insert(0, string("TTT"));
cout << s0 << endl;//TTTabWWWcABCabc
s0.insert(0, 2, 'H');
cout << s0 << endl;//HHTTTabWWWcABCabc
3.8 string删除元素
string类通过erase函数实现删除元素。
| 声明 | 解释 |
| string& erase(int pos, int n = npos) |
从下标pos位置开始,删除n个字符 (删除的字符,从pos开始算第一个,也就是pos对应的元素也要删除) |
string s0("abcABCabc");
s0.erase(3, 3);//abcabc
3.9 string类取子串
string类通过substr函数实现取子串。
| 声明 | 解释 |
| string& substr(int pos = 0, int n = npos) |
返回当前字符串的从下标pos开始的n个字符组成的字符串 (默认参数npos代表的是字符串的最后一个下标) |
string s0("abcABCabc");
cout << s0.substr() << endl; //abcABCabc
cout << s0.substr(3) << endl; //ABCabc
cout << s0.substr(3, 3) << endl;//ABC
1628

被折叠的 条评论
为什么被折叠?



