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;