C++的string容器

一、介绍

        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)  将字符串spos开始的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值