9.5 额外的string操作
文章目录
- 构造string的其他方法
- substr操作
- assign
- 改变string的其他方法
- string的搜索操作
- compare函数
- 数值转换
部分前提在 string。
构造string的其他方法
除了之前链接介绍的string构造方法,还有几种需要介绍一下:
n len pos 都是无符号整数
构造方法 | 说明 |
---|---|
string s(cp,n) | s是指向cp当中前n个字符的拷贝,也就是说,cp至少n个字符 ,注意cp是指针,指向的是字符数组,给出的n如果大于size,那么将发出out_of_range的异常 |
string s(s2,pos) | s2为string类型,从下标pos开始拷贝至空字符结束 |
string s(s2,pos,len) | s2为string类型,从下标pos开始拷贝len长度结束 |
- 注意如果不添加数字,那么都是从头开始直到遇到空字符结尾,如果该字符串不存在空字符将发生未定义的错误。
substr操作
substr操作返回一个string,它是原始string的一部分或全部的拷贝。可以传递给substr一个可选的开始位置和计数值。
s.substr(pos,n);//返回一个string,包含s从pos开始长度为n的字符串的拷贝。pos的默认值为0,n的默认值为s.size()-pos
string s = "hello world";
string s2 = s.substr(0,5);//s2 = "hello"
string s3 = s.substr(6);//s3 = "world"
string s4 = s.substr(6,11);//s4 = "world"
string s5 = s.substr(12);//out_of_range
assign
由于之前介绍过,这边只是提一嘴:
//使用替换函数进行赋值
s.assign(4,'h');//hhhh
s.assign(s.begin(),s.begin()+1);//h
改变string的其他方法
- 顺序容器常规操作
- insert和erase除迭代器(也就是顺序容器的操作)外接受下标位置定位,insert支持插入C风格字符数组以及字符串。
//insert
s.insert(s.size(),5,'!');//在s字符串最后面加上5个!
s.insert(0,s2,0,s2.size());//在s字符串中从s[0]位置开始插入s2的从s2[0]开始的长度为s2.size()的字符串。
//erase
s.erase(s.size()-5,5);//删除s字符串最后面5个字符。
//append
c.append(str); //字符串末尾插入
//replace
c.replace(pos,n,str);//将下标位置处开始的n个字符串替换为str
string的搜索操作
- 6个搜索函数,4个重载版本
- 成功返回string::size_type值,失败返回string::npos静态成员,npos的默认初始值为-1,但是其类型是static const string::size_type类型,所以其值代表着string的最大的可能大小。
- 注意,last相关查找是从后往前,pos位置写的是起始位置,如果找0到10内是否有字符串,pos = 10。
- find()查找第一次出现的目标字符串(全匹配)
- find_first_of() 查找子串中的某个字符最先出现的位置(非全匹配)
- find_last_of() 这个函数与find_first_of()功能差不多,只不过find_first_of()是从字符串的前面往后面搜索,而find_last_of()是从字符串的后面往前面搜索(非全匹配)
- rfind() 反向查找字符串,即找到最后一个与子串匹配的位置(全匹配)(从前往后搜索)
- find_first_not_of() 找到第一个不与子串匹配的位置(非全匹配)
函数 | 说明 |
---|---|
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指针指向的c格式的字符数组的前n位,pos和n没有默认值 |
给个样例辅助理解:
string s = "yhhdyzwhhhhhdy!";
string s2 = "zwhy";
char cstr[] = "dy";
vector<string::size_type> i(7,0);
i[0]= s.find("hhdy");//字符串第一次出现的位置,返回1
i[1] = s.find("zwhy");//找不到,返回npos
i[2] = s.rfind(cstr);//dy最后一次出现位置,返回12,注意不是反向寻找
i[3] = s.find_first_of("dy", 5);//dy在s[5]之后第一次出现的位置,返回12
i[4] = s.find_last_of(cstr, 0, 1);//返回npos,因为last相关是从后往前查找,pos = 0,从0查到0
i[5] = s.find_first_not_of("hdy");//第一次不出现“hdy”中字符的位置,返回5(z)
i[6] = s.find_last_not_of("hdy");//最后一次不出现“hdy”中字符的位置,返回14(!)
const char cstr1[] = "hdy";
i[7] = s.find_last_of(cstr1,14,1); //返回11
compare函数
//具体用法:s.compare(参数)
//compare内部的参数
//()内可省略
(pos1,n1),s2,(pos2,n2)//string类型s2,将从s当中的pos1开始的n1个字符与s2当中从pos2开始的n2个字符进行比较。
(pos1,n1),cp,(n2)//字符数组指针cp,将从s当中的pos1开始的n1个字符与cp指向的地址开始的n2个连续字符组成的c字符串数组进行比较。
数值转换
to_string(val) //val是任意算术类型,将val转换成字符串。
//string转换为int、long、unsignedlong、longlong、unsignedlonglong
//p为s下标,即从哪里开始,默认0,b为基数(默认10)即转化为十进制。
stoi(s,p,b)//string转化为int
stol(s,p,b)//string转化为long
stoul(s,p,b)//string转化为unsigned long
stoll(s,p,b)//string转化为long long
stoull(s,p,b)//string转化为unsigned long long
//string转换为float、double、long double
stof(s,p)//string转化为float
stod(s,p)//string转化为double
stold(s,p)//string转化为long double