C++ STL string容器超详解(已优化)

1.string的基本概念

概念:string是c++中的字符串类型,相当于C语言中的char *,其本质是一个封装好的类

stringchar*的区别:

  • char* 是一个指针
  • string是一个内部封装了char* 的类,用来管理这个字符串,是一个char*型容器

特点:

  • string类内部封装了很多成员函数
    例如:查找find,拷贝copy,删除delete,替换replace,插入insert
  • string管理char*所分配的内存,不用担心赋值越界和取值越界等问题,由类内部负责

2.string的构造函数

函数原型:

  1. string(); 默认构造,创建一个空字符串
  2. string(const char* s); 使用字符串初始化
  3. string(const string& str); 拷贝构造,使用一个string对象初始化另一个string对象
  4. string(int n,char c); 使用n个字符c初始化

使用:

  1. string str;
  2. string str("abcdef")string str(s);
  3. string str1(str2);
  4. string str(n,c);

测试案例

void text01()
{
	string str1;             //1
	string str21("aaaaa");   //2
	string str22="bbbbb";
	string str3(str21);      //3
	string str4(5, 'c');     //4
	cout << "str21=" << str21 <<"\nstr22=" << str22 
		 << "\nstr3=" << str3 << "\nstr4=" << str4 << endl;
}

测试结果
在这里插入图片描述

3.string的赋值操作

函数原型:

  1. string& operator=(const char* s); char* 类型字符串赋给当前字符串
  2. string& operator=(const string& str); string类型字符串str赋给当前字符串
  3. string& operator=(char c); 单个字符赋给当前字符串
  4. string& assign(const char* s); char*类型字符串赋给当前字符串
  5. string& assign(const char* s,int n); 把字符串s前n个字符赋给当前字符串
  6. string& assign(const string& str); string类型字符串str赋给当前字符串
  7. string& assign(int n,char c); 把n个字符c赋给当前字符串

使用:
使用起来都比较简单,见下面案例

测试案例

void text02()
{
	string str[7];
	str[0] = "aaaaa";              //1
	str[1] = str[0];               //2
	str[2] = 'a';                  //3
	str[3].assign("bbbbb");        //4
	str[4].assign("ccccc", 3);     //5
	str[5].assign(str[4]);         //6
	str[6].assign(5, 'd');         //7
	cout << "\nstr[0]=" << str[0] << "\nstr[1]=" << str[1] << "\nstr[2]=" << str[2] << "\nstr[3]=" << str[3]
		 << "\nstr[4]=" << str[4] << "\nstr[5]=" << str[5] << "\nstr[6]=" << str[6] << endl;
	cout << "str[0][0]=" << str[0][0] << endl;
}

测试结果
在这里插入图片描述

3.string字符串的拼接

函数原型:

  1. string& operator+=(const char* s); 重载+=
  2. string& operator+=(const char c);
  3. string& operator+=(const string& str);
  4. string& append(const char* s); 把字符串s连接到当前字符串尾
  5. string& append(const char* s,int n); 把字符串s前n个字符连接到当前字符串尾
  6. string& append(const string& str);
  7. string& append(const string& str,int pos,int n); 把字符串str从pos开始的n个字符连接到当前字符串尾

使用:
string类型拼接字符串还是相当方便的,特别是前三个重载运算符,使用频率非常高。接下来先做几个变量的声明,方便下面使用string str1,str2;char* s;char c;

  1. str1 += sstr1 = str1 + s;
  2. str1 += c;str1 = str1 + c;
  3. str1 += str2;str1 =str1 + str2;

测试案例

void text03()
{
	string str1;
	string str2 = " C++";
	string str3 = " ,yesssssss";
	str1 += 'I';                               //2,
	str1 += " love";                           //1
	str1 += str2;                              //3
	str1.append(" and");                       //4
	str1.append(" algorithm aaa",10);          //5
	str1.append(str3);                         //6
	str1.append(str3, 0, 5);                   //7
	cout << str1;
}

测试结果
在这里插入图片描述

4.string查找与替换

接下来介绍:

  • 查找函数findrfind,功能是查找指定字符串是否存在,若存在返回出现的下标位置,若不存在返回-1
  • 替换函数replace在指定位置替换字符串中某些字符

函数原型:

  1. int find(const string& str,int pos = 0);从pos开始查找字符串str第一次出现的位置
    使用:int num = str1.find(str2,pos);以下几个使用类似
  2. int find(const char* s,int pos=0); 从pos开始查找字符串s第一次出现的位置
  3. int find(const string& str,int pos = 0,int n);从pos开始查找字符串str的前n个字符第一次出现的位置
  4. int find(const char c,int pos=0); 从pos开始查找字符c第一次出现的位置
  5. int rfind(const string& str,int pos = npos);从pos开始查找字符串str最后一次出现的位置
  6. int rfind(const char* s, int pos = npos); 从pos开始查找字符串s最后一次出现的位置
  7. int rfind(const string& str,int pos,int n);从pos开始查找字符串str的前n个字符最后一次出现的位置
  8. int rfind(const char c,int pos=0); 从pos开始查找字符c最后一次出现的位置
  9. string& replace(int pos,int n,const string& str);用字符串str替换从pos开始的n个字符
    使用: str1.replace(pos,n,str2);
  10. string& replace(int pos,int n,const char* s);用字符串s替换从pos开始的n个字符

测试案例

void text04()
{
	string str1 = "abcdEabcdef";
	int pos = str1.find("cd");
	if (pos != -1)
	{
		cout << "pos=" << pos << endl;
	}
	else cout << "未找到" << endl;

	pos = str1.rfind("cd");
	if (pos != -1)
	{
		cout << "pos=" << pos << endl;
	}
	else cout << "未找到" << endl;

	str1.replace(2, 3, "1234");//用"1234"替换从第二个位置开始的3个字符
	cout << str1 << endl;
}

测试结果
在这里插入图片描述

5.string的比较

比较方式:
字符串之间的比较是逐个字符按照ASCII码大小进行比较的,调用str1.compare(str2)成员函数。
函数原型:

  • int compare(const string& str);与字符串str比较
  • int compare(const char* s);与字符串s比较

当两个字符串相等时(即字符串完全相同)函数返回 0 ;
str1大于str2时函数返回 1;
str1小于str2时函数返回 -1;

特别地,判断两个string类字符串的大小还可以使用重载的运算符 ==、!=、>、<、>=、<= 进行比较。
如:str1 == str2str1 > str2str1 <= str2

测试案例

void text05()
{
	string str1 = "abcdefg";
	string str2 = "bcdef";
	if (str1.compare(str2) == 0)//或者使用 str1==str2
		cout << "字符串相等\n";
	else if (str1.compare(str2) > 0)//或者使用 str1 > str2
		cout << "str1较大\n";
	else
		cout << "str1较小\n";

	if (str1.compare("abcdefg") == 0)
		cout << "字符串相等\n";
	else if (str1.compare("abcdefg") > 0)
		cout << "str1较大\n";
	else
		cout << "str1较小\n";
}

测试结果
在这里插入图片描述

6.string的存取

字符串的存取即 string中单个字符的访问与修改
函数原型:

  1. char& operator[](int n) 通过[]方式访问与修改字符
  2. char& at(int n) 通过at方式获取字符

使用:str[i]
一般第一种方式比较常用,也容易记忆,毕竟数组就是通过[ ]来访问或修改的

测试案例

void text06()
{
	string str = "abcde";
	
	for (int i = 0; i < str.size(); ++i) //size() 是获取字符串大小的函数
	{
		str[i] = 'A'+i;           //通过[]方式修改
		cout << str[i] << " ";    //通过[]方式访问
	}
	cout << endl;
	for (int i = 0; i < str.size(); ++i) 
	{
		str.at(i) = 'a' + i;          //通过at方式修改
		cout << str.at(i) << " ";     //通过at方式访问
	}
}

测试结果
在这里插入图片描述

7.string的插入和删除

函数原型:

  1. string& insert(int pos,const char* s); 从pos位置开始插入字符串s,pos均从0开始计数
  2. string& insert(int pos,const string& str); 从pos位置开始插入字符串str
  3. string& insert(int pos,int n,char c); 从pos位置开始插入n个字符c
  4. string& erase(int pos,int n=npos); 从pos位置开始删除n个字符

使用:

  1. str.insert(pos,s);
  2. str.insert(pos,str);
  3. str.insert(pos,n,c);
  4. str.erase(pos,n);

测试案例

void text07()
{
	string str = "hello";
	str.insert(2, "123");
	cout << "插入后:" << str << endl;

	str.erase(2,3);
	cout << "删除后:" << str << endl;
}

测试结果
在这里插入图片描述

8.string的子串

接下来介绍一个从字符串中获取想要的子串的函数
函数原型:
string substr(int pos,int n=npos);
返回由pos开始的n个字符组成的子串,默认的npos是从pos到字符串结尾的所有字符的个数

测试案例

void text08()
{
	//获取QQ邮箱前面的QQ号
	string str = "123456789@qq.com";
	int pos = str.find("@");
	string QQnumb = str.substr(0, pos);
	cout << "邮箱为:" << str << endl;
	cout << "QQ号为:" << QQnumb << endl;
}

测试结果
在这里插入图片描述

  • 23
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

&不逝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值