C++学习笔记【顺序容器——额外的string操作】

string类型会提供一些除顺序容器共有的操作外的其他操作。

1、构造string的其他方法

除了基本的构造函数,以及顺序容器所共有的构造函数外,string还支持另外三个构造函数。

构造方法描述
string s(cp,n)s是cp指向数组的前n个字符的拷贝
string s(s2,pos2)s是s2字符串从pos2开始到结束的字符串拷贝,pos2<s2.size()
string s(s2,pos2,len2)s是s2字符串从pos2开始长度为len2的字符串拷贝,pos2<s2.size(),最多拷贝s2.size()-pos2个字符

注意:s2可以是const char*类型,但指针指向的数组必须以空字符结尾,因为拷贝操作遇到空字符时停止。如果还传递给构造函数一个计数值,数组就可以不用以空字符结尾。

返回子串操作。

s.substr(pos,n) //返回string类型,包括s从pos开始长度为n的字符串拷贝
//pos的默认值为0,n的默认值为s.size()-pos,即拷贝从pos开始到结束的字符串
if(pos>s.size())
	抛出out_of_range异常

2、改变string的其他方法

string支持顺序容器的赋值运算符以及assign、insert和erase操作。除此之外,它还定义了额外的insert和erase版本。还定义了额外的成员函数:append和replace。append是在string末尾进行插入操作,replace则是替换操作。

string s;	//非严格定义,只为了描述函数
s.insert(pos,args) 	//在pos之前插入args,返回指向s的引用
					//args可以是字符串、字符数组
s.insert(iter,args) //在iter之前插入args,返回指向第一个插入字符的迭代器
					//args可以是一对迭代器指定的范围内的字符
s.erase(pos,len)	//删除从pos开始的len个字符。如果len缺省,删除pos后所有字符
					//返回一个指向s的引用,pos不支持迭代器
s.assign(args)		//将s替换为args,返回指向s的引用,可以简单理解为赋值
s.append(args)		//把args插入到s的末尾,返回指向s的引用
s.replace(range,agrs)//删除s中范围range内的字符,替换为args指定的字符
					//range可以是下标和长度,或者是一对迭代器
					//agrs可以是字符串、字符数组

因为以上函数有多个重载版本,具体的参数列表需要查看标准库函数。

//利用insert,erase实现简易replace操作
void rePlace(string &s,string oldVal,string newVal)
{
    size_t pos=s.find(oldVal);
    while(pos!=s.npos) {
        s.erase(pos, oldVal.length());
        s.insert(pos, newVal);
        pos=s.find(oldVal,pos+newVal.length());
    }
}

3、string搜索操作

string提供了6个不同的搜索函数,每个函数都有4个重载版本。每个搜索操作都返回一个string::size_type值,表示匹配发生位置的下标。如果搜索失败,则返回string::npos的static成员。

注意:size_type是无符号类型,用int或其他带符号类型来保存这些函数的返回值可能会超出表示范围,导致溢出。

args可重载为以下形式
(c,pos)			//从pos开始查找字符c,pos默认为0
(s2,pos)		//从pos开始查找字符串s2,pos默认为0
(cp,pos)		//从pos开始查找cp指向的C风格字符串(空字符结尾),pos默认为0
(cp,pos,n)		//从pos开始查找cp指向的数组的前n个字符

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中的字符

看下搜索操作的效果

string s="through_fun_through";
string str="through";
cout<<s.find(str)<<" "<<s.rfind(str)<<endl;
cout<<s.find_first_not_of(str)<<" "<<s.find_last_not_of(str)<<endl;

在这里插入图片描述
可以看到find会从头开始向后找,直到找到第一个匹配的字符串;rfind会从后向前找;find_first_not_of会从头找到第一个不匹配的字符的下标;find_last_not_of会从头找到最后一个不匹配的字符的下标

4、数值转换

to_string(val)		//返回val的string表示,val可以是任何算数类型

stoi(s,p,b)			//返回s的字串所表示的整数数值
stol(s,p,b)			//返回类型是int,long,usigned long,long long
stoul(s,p,b)		//usigned long long
stoll(s,p,b)		//p用来保存s中第一个非数值字符的下标
stoull(s,p,b)		//b用来表示s中数值的进制

stof(s,p)			//返回s的字串的数值,返回类型是float,double,long double
stod(s,p)
stold(s,p)

测试一下效果

string s="1001_fun_through";
size_t *p=new size_t ;
cout<<"Normal: "<<stoi(s)<<endl;
cout<<"Binary: "<<stoi(s,p,2)<<endl;
cout<<"p: "<<*p;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值