C++STL中字符串类

  • 字符串类概念

    C语言中每新建一个数组都要标明下标,以方便分配内存;或使用指针,但不能进行插入替换等操作。故C++引入String类,以方便进行字符串的各种操作及存储。


    字符串的头文件

    #include<string>

  • 字符串类的创建及初始化

  • 初始化的三种方式

字符串创建有三种方式,可以赋值或拷贝

    string s1;
	string s2("tryre");//将tryre拷贝到s2
	string s3(s2);//将s2拷贝到s3
	string s4 = "ruytr";//将ruytr赋值到s4
    //赋值运算符重载(类中重载)
	string s5(s2,1,3);//引入三个量:拷贝本体、开始下标、长度
	//pos-->1   len-->3     pos:从0开始的下标   len:长度
	//ryr给s5
    string s6(s2,3);//引入两个量:拷贝本体、长度
    //try给s6

 可通过cplusplus.com来查询string重载类型

    string s6(s2.begin(),s2.end());
//begin-->t,end-->e的下一个位置         
//返回值迭代器
	string s7(s2.begin(), s2.begin()+4);
	cout << s7 << endl;//左闭右开取tryr

s7中的s2.begin()+4代替了s2.end()的位置,所以是开区间

eg:[1,7)-->123456

  • 读取

cout << s2[2] << endl;//取大数会越界,但程序不会停

//不检测越界,数据不安全,会读到其他地方

//读越界数程序不报错

cout << s2.at(2) << endl;//at()函数,检测越界

 //at()函数安全,不会读到其他地方

//读越界数程序报错,相对安全

  • 插入数据

有insert、append(追加)、+(在string中重载运算符+,使其变为连接作用)三种类型

//插入
	s2.insert(1, "uuu");//插入用insert:俩参数(第几个位置插入几)
	//中间插
	cout << s2 << endl;
//tuuuryre
	s2.append("ww");//追加,往后加
    //后面插
	cout << s2 << endl;
//tuuuryreww
	s2 = s2 + "kk";//连接,往后连接
	//重载+
	cout << s2 << endl;
//tuuuryrewwkk

在string类中insert的重载

  • 替换数据

//替换
	s2.replace(4,3,"ccc");//仨参数pos,len,替换的东西
	//还可以用迭代器
	cout << s2 << endl;
  • 求子串

//求子串
	s2.substr(4,3);//俩参数pos,len
	cout << s2 << endl;
  • 比较大小

比较的是字符串的ASCll码值

//比较大小
	cout << (s2 > s4);
  • 字符串的查询和删除

  • 查询

查询结果是返回下标,结果输出应为整型

string str = "how are you";
	int n = str.find("are");
//输出为a的地址
//查找返回下标是整型


	int n = str.find("l"); 
//有l就返回l所对应的下标
//没有就返回-1,因为下标都是大于等于0  -->npos
//若用迭代器,则返回为空,结束迭代器为空


	int n = str.find("o", 5);
//从第五个后查到o
//返回第五个后遇到的第一个o的地址
//返回第一个与指定字符串中任意一个字符匹配的位置


	int n = str.find_first_of("abc");//从开始查找与abc任意一个相同的位置
		//3
	int n = str.find_last_of("abc");
	int n = str.find_first_not_of("abc");
	int n = str.find_last_not_of("abc");
	cout << n << endl;

 string类中find的重载

  • 删除

	//删除
	str.erase(0, 4);
//pos len    表示删除从pos地址开始的len个单位的字符
//输出结果为are you


	str.erase(1);
//pos pos默认npos     表示从1以后都删
	cout << str << endl;


	string str1 = "how are you";
	str.erase(str1.begin() + 1);//hw are you
//迭代器起始迭代器表示闭着的,所以表示从0+1开始


	str.erase(str1.begin(), str1.end() - 3);//只剩u
//起始迭代器表示闭着的,结束迭代器表示开着的,本身是h到用,但因为结束迭代器指往后一位,所以到
	cout << str1 << endl;

要注意起始迭代器和结束迭代器定义的差别


用查找返回下标

//删除字符串两段空格
void test3()
{
	string s = "  how are you   ";
	s.erase(0,s.find_first_not_of(" "));//pos len
	//s.find_first_not_of(" ")返回下标,表示len不需要+-1
	s.erase(s.find_last_not_of(" ") + 1);//npos删掉后面所有
	cout << s << endl;
}
  • 字符串与其他类型的转换

//字符串与其他类型的转换
//用字符串流解决
//n(内存)<--写,输出--字符串流(内存,看成txt)--读,输入-->s(内存)
void test4() {
	//整型转字符串
	int n = 8;
	string s;

	stringstream it;
	it << n;//写入字符串流,输出
	it >> s;//读,输入

	cout << s << endl;

	//字符串转整型
	string s1 = "567";
	int n1;
	stringstream ip;//派生类(可读可写)
	ip << s1;//写入字符串流,输出
	ip >> n1;//读,输入

	cout << n1 << endl;
}
  • 拆分字符串 

//拆分字符串
void test5()
{
	//空格,换行做分隔符
	string str("how are you");
	string s;

	//输入流
	istringstream in(str);
	while (!in.eof())//读到流的结束
	{
		in >> s;
		cout << s << endl;
	}

	//逗号做分隔符
	string str1("how,are,you");
	istringstream in1(str1);
	while (!in1.eof())//读到流的结束
	{
		getline(in1,s,',');//getline传三个参
		cout << s << endl;
	}
}
  • 总结

  • 字符串类的初始化有赋值和拷贝两种方法
  • 读取注意使用at函数防止越界
  • 常见的插入数据有有insert、append(追加)、+(在string中重载运算符+,使其变为连接作用)三种类型
  • 替换用replace,传三个参(pos,len,替换数据)
  • 求子串用substr(pos,len)
  • 查询返回类型是int型,查不到就返回-1
  • 删除注意迭代器表示的大小
  • 拆分字符串若不以空格或换行为界限,则用getline函数重新定义拆分符号
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

狒狒998

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

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

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

打赏作者

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

抵扣说明:

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

余额充值