STL中string的额外操作

  • 构造string的其他方法

string s1;
string s2(s1);
string s2=s1;
string s3("value");
string s3="value";
string s4(n,'c');    //把s4初始化为由连续n个字符c组成的串
出了以上构造函数和顺序容器相同的构造函数外,string类型还支持另外三个构造函数
string s(cp,n);    //s是cp所指向的数组中前b个字符的拷贝,此数组至少应该包含n个字符,n不能超过此数组中包含的字符个数

	const char*p = "good";
	char p1[] = { 'h','e','l','l','o' };
	char p2[] = { 'h','e','l','l','o','\0' };
	string s(p, 3);
	string ss(p);
	cout << "s=" << s << endl;  //goo
	cout << "ss=" << ss << endl;  //good
	string s1(p1);   
	string ss1(p1, 3);
	string s2(p2);
	cout << "ss1=" << ss1 << endl;  //hel
	cout << "s2=" << s2 << endl;   //hello
	cout << "s1=" << s1 << endl;   //hello+一堆乱码
	string s3(p2, 100);
	cout << "s3=" << s3 << endl;   //hello+一堆乱码

当我们从一个const char*(或char*)通过拷贝创建string时,指针指向的数组必须以空字符,也就是\0为结尾,这样拷贝操作遇到空字符时则会停止,如s1则拷贝了一个没有以空字符结尾的字符数组、s3则传递了一个大于数组字符个数的参数,则俩者的行为是未定义的,所以打印出的结果就会出现一些乱码

string s(s2,pos);         //s是string s2 从下标pos开始的字符的拷贝,若pos>s2.size(),构造函数未定义
string s(s2,pos,len);   //s是string s2 从下标pos开始len个字符的拷贝,若pos>s2.size(),构造函数未定义,不管len的值是多少,构造函数至多拷贝s2.size()-pos个字符

  • substr操作

s.substr(pos,n) 操作返回一个string,它是原始string的一部分或全部的拷贝,可以传递给substr一个可选的开始位置和计数值,pos的默认值为0,n的默认值是s.size()-pos,即不加参数会默认拷贝整个s

string s("hello world");
stirng s2=s.substr(0,5);    //从s中把从第0位开始的长度为5的字符串拷贝到s2(打印的值为hello)
string s3=s.substr(6);       //从s中下标为6的位置拷贝到结尾
string s4=s.substr(12);     //开始位置超过了string的大小,则结果未定义

  • 改变string的其他方法

string类型支持顺序容器的赋值运算以及assign、insert和erase操作,除此之外,它还定义了额外的insert和erase版本

insert、erase、assign:

s.insert(s.size(),5,'!');   //在s末尾插入5个感叹号
s.insert(0,s2,0,3);    //在s[0]之前插入s2中s2[0]开始的3个字符
s.erase(s.size()-5,5);   //从s删除最后5个字符

标准库string类型还提供了接受C风格字符数组的insert和assign版本

const char*cp="Stately,plump Buck";
s.assign(cp,7);              //s="Stately"    从cp指向地址开始的7个字符
s.insert(s.size(),cp+7);  //s="Stately,plump Buck"    将字符插入到s[size()]处元素之前的位置,也就是从s[size()]进行新元素的赋值

string s("ssss");
string s1("dddd");
s.insert(0,s1);
cout<<s<<endl;   //ddddssss

string s("ssss");
string s1("dddd");
s.insert(1,s1);
cout<<s<<endl;   //sddddsss

string s("ssss");
string s1("dddd");
s.insert(0,s1,0,1);  
cout << s << endl;  //dssss

append和replace函数:

append操作是在string末尾进行插入操作的一种简写形式
string s("ssss");
s.append("dddd");      //s.insert(s.size(), "dddd");
cout << s << endl;      //ssssdddd

replace操作是调用erase和insert的一种简写形式
string s("ssssssss");
//s.erase(4, 3);   
//s.insert(4, "ddd");  
s.replace(4, 3, "ddd");   
cout << s << endl;   //ssssddds
replace函数的第二个为插入文本的长度,这个参数不是必须与第三个参数长度一样,可以插入一个更长或更短的string
s.replace(4,3,"ddddd");   //ssssddddds  在此调用中删除了3个字符,但在其插入了5个新字符

对于迭代器的操作需要特殊注意:

b,e    迭代器b和e指定的范围内的字符,迭代器e默认是尾后迭代器,所以只能拷贝到e-1所指向的元素

string s("abcdef");
string s1(s.begin(), s.end() - 3);
cout << s1 << endl;   //abc
string s2 = s.assign(s.begin(), s.end() - 3);
cout << s2 << endl;   //abc

  • string搜索操作

string类提供了6个不同的搜索函数,每个函数都有4个重载版本,每个搜索操作都返回一个string::size_type值,表示匹配发生位置的下标,该类型是一个unsigned类型,因此,用一个int或其他带符号类型来保存这些哈数的返回值不是一个好主意,如果搜索失败,则返回一个名为string::npos的static成员

string s("abcde");
auto pos1=s.find("a");   //pos1=0
搜索是大小写敏感的,当在string中查找子字符串时,要主意大小写
string s("abcde");
auto pos1=s.find("A");   //pos1==string::npos(一个未知数)

相关操作:

s.find(args);          //查找s中args第一次出现的位置
s.rfind(args);         //查找s中args最后一次出现的位置
s.find_first_of(args);   //在s中查找args中任何一个字符第一次出现的位置
s.find_last_of(args);   //在s中查找args中任何一个字符最后一次出现的位置
s.find_first_not_of(args);   //在s中查找第一个不在args中的字符的位置
s.find_last_not_of(args);   //在s中查找最后一个不在args中的字符的位置

args必须是以下形式之一:
c,pos      //从s中位置是pos的地方,开始查找字符c,pos默认为0
s2,pos    //从s中位置是pos的地方,开始查找字符串s2,pos默认为0
cp,pos    //从s中位置是pos的地方,开始查找指针cp指向的以空字符结尾的C风格字符串,pos默认为0
cp,pos,n   //从s中位置是pos的地方,开始查找指针cp指向的数组的前n个字符,pos和n无默认值

string number("012345678"), name("r9d2");
auto pos = name.find_first_of(number);
cout << pos << endl;   //pos为3 即name中第一个数字的下标
string dept("03714p3");
auto pos2 = dept.find_first_not_of(number);
cout << pos2 << endl;  //pos2为5 搜索dept中第一个非数字字符

在字符串中循环搜索子字符串出现的所有位置:

	string numbers("0123456789");
	string name("r2d2");
	string::size_type pos = 0;
	//每步循环查找name中下一个数
	while ((pos = name.find_first_of(numbers, pos)) != string::npos)
	{
		cout << "found number at index:" << pos << "  element is  " << name[pos] << endl;
		++pos;
	}
  • compare函数

string提供了一组compare函数,这些函数与C标准库的strcmp函数很相似,类似strcmp,根据s是=、>还是<参数指定的字符串,s.compare返回0、正数或负数

s.compare(s2);      //比较s和s2
s.compare(pos1,n1,s2);    //将s中从pos1开始的n1个字符与s2进行比较
s.compare(pos1,n1,s2,pos2,n2);  //将s中从pos1开始的n1和字符与s2中从pos2开始的n2和字符进行比较
s.compare(cp);     //比较s与cp指向的以空字符结尾的字符数组
s.compare(pos1,n1,cp);     //将s中从pos1开始的n1个字符与cp指向的以空字符结尾的字符数组进行比较
s.compare(pos1,n1,cp,n2);  //将s中从pos1开始的n1个字符与指针cp指向的地址开始的n2个字符进行比较

  • 数值转换

新标准引入了多个函数,可以实现数值数据与标准库string之间的转换

to_string(val)   //返回数值val的string表示,val可以是任何算术类型
stoi(s,p,b)   //返回s的起始子串的数值,b表示转换所用的基数,默认是10,p是size_t指针,用来保存s中第一个非数值字符的下标,p默认为0,即,函数不保存下标,返回值类型是int
stol 返回long、stoul返回unsigned long、stoll返回long long、stoull返回unsigned long long
stof(s,p)   //返回s的起始子串的数值,返回类型分别是float、double或long double,参数p的作用与整数转换函数中一样
stod(s,p)、stold(s,p)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值