#include
最简单粗暴的定义形式:
string str;
定义一个名为str
的空字符串,不需要设置长度,系统会根据字符串的内容自行分配空间,并跟随其长度的改变而改变。它是个类,自然可以有构造函数,所以出了最简单粗暴的定义外,它还可以使用系统自带的构造函数进行花里胡哨的定义:
string s1(str);//调用拷贝构造函数,以字符串str为模版,创建新的字符串s1
string s2(str,start);//用字符串str内,从start开始往后的部分,作为字符串s2的初始值
string s3(str,start,len);//用str内从start开始往后长度为len的部分,作为字符串s3的初始值
string s4(charstr,len);//用char型字符串的前len个字符作为字符串s4的初始值
string s5(num,c);//生成一个含有num个字符c的字符串
例如:
#include
#include
using namespace std;
int main(){
string str="0123456789";//模版
string s1(str);//这里的str换成char字符串也可以
string s2(str,3);
string s3(str,3,5);
char ch[100]="abcdef";
string s4(ch,3);
string s5(5,'6');//注意,第二个变量是"字符",需要用单引号
cout<<s1<<endl;
cout<<s2<<endl;
cout<<s3<<endl;
cout<<s4<<endl;
cout<<s5<<endl;
return 0;
}
输出:
0123456789 //s1
3456789 //s2
34567 //s3
abc //s4
66666 //s5
有下标法和迭代器法两种,我觉得暂时不需要掌握迭代器,下表法在现阶段完全够用。
所谓下标法,就是跟char字符串和数组那样,用[]
来调用单个元素
string s="0123456";
cout<<s[3];
输出
3
在后面的“string长度”中,会见到一个重要成员函数size()
,有关下标法和size()
的共同使用可参照那一部分的示例。
相比于char字符串,string字符串的一个显著优势就是可以直接使用运算符号,相当于string类在声明时重载了运算符。
支持如下运算符:
=
赋值符(注意不是等号!)+=
在字符串后接新内容+
串联字符串==``!=
判断两个字符串是否完全一致<``>``<=``>=
以字典序依次比较两个字符串>>``<<
直接输入、输出以下成员函数均在头文件
内,使用.
调用
用成员函数size();``length();
来返回string字符串的字符个数,两个成员函数具有几乎相同的效果,作用相当于char字符串的strlen(str);
,常出现在for循环的第二个条件里。
比如,如果想把一个字符串中的大写字母全变为小写字母:
string s="aAbBcCdD";
for(int i=0;i<s.size();i++) //用到s.size();表示字符串长度
if(s[i]>='A'&&s[i]<='Z')
s[i]+=('a'-'A');
cout<<s;
输出:
aabbccdd
用成员函数swap(str1,str2)
交换两个字符串的内容
例如:
string s1="123",s2="abc";
swap(s1,s2);
cout<<s1;
输出:
abc
用成员函数begin()
返回字符串的首地址
用成员函数end()
返回成员尾地址的后一位
string s="012345";
cout<<s.end()-s.begin();
输出
6
如果给出一个乱序字符串,要求按照字典序排列:
string s="ajxltbyqkwltrbfy"; //爱就像蓝天白云晴空万里突然暴风雨
sort(s.begin(),s.end()); //借助sort进行排序
cout<<s;
输出:
abbfjkllqrttwxyy
对sort函数不熟悉的同学可以参考我的另一片博客:
sort排序函数入门用法
用成员函数push_back(c);
将单个字符c插入到字符串尾端,也可以用+=
实现一样的作用
例如
string s="abc";
s.push_back('d'); //s=abcd
s+='e'; //s=abcde
cout<<s;
输出
abcde
用成员函数insert(pos,c);
在指定位置pos的前面插入字符c
例如
string s="12345";
s.insert(s.begin()+1,'w');
cout<<s;
输出
1w2345
ps.趁机加深理解一下上面的end()
:
string s="12345";
s.insert(s.end(),'w');
cout<<s;
输出
12345w
可以明确的看出,如果s.end()
指向的位置是最后一个字符5,那么按照insert()
的规则,w
应该出现在4
和5
之间。
使用成员函数append(str)
向已有的字符串后拼接新的字符串,效果与+=
相同
例如
string s="520";
s.append("13"); //s=52013
s+="14"; //s=5201314
cout<<s;
输出
5201314
使用erase()
来删除字符串中的某一特定部分:
erase(pos)
删除某一位置的字符erase(start,end)
删除[start,end)之间的全部字符erase(pos,len)
删除从pos开始往后的len个字符string s="0w12345678";
s.erase(s.begin()+1); //s=012345678
s.erase(1,3); //s=045678
s.erase(s.begin()+1,s.end()-2); //s=078
使用clear()
来快速清空整个字符串
s.clear(); //s被清空
用replace()
实现字符串指定位置的部分替换
replace(pos,n,str)
将字符串从pos开始往后的n个字符替换为字符串str
,字符串str
的长度不一定为nreplace(pos,n,m,c)
将字符串从pos开始往后的n个字符替换为m个字符c,m和n不一定相等replace(start,end,str)
将字符串[start,end)之间的部分替换为字符串strstring s="I hate you.";
s.replace(2,4,"love");
cout<<s<<endl;
s.replace(s.begin()+1,s.begin()+2," don't ");
cout<<s<<endl;
s.replace(0,s.size(),3,'h');
cout<<s;
输出:
I love you.
I don't love you.
hhh
在字符串中,按照一定的顺序(正向/反向)查找某一字符/字符串
find(str,pos)
从pos开始,查找字符串str(可以是一个字符),返回找到的位置(下标),如果没找到则返回-1,pos的默认值为0
rfind(str,pos)
从pos开始,反向查找字符串str(可以是一个字符),返回找到的位置(下标),如果没找到则返回-1,pos的默认值为npos
,即从最后开始找
string s="ooo0ooo0ooo";
cout<<s.find('0')<<endl; //第一个0,下标3
cout<<s.rfind('0'); //倒着找的第一个0,下标7
输出:
3
7
还有好几个不算太常用的查找函数,比如:
find_first_of(str,pos)
查找第一个属于str字符串的字符find_first_not_of(str,pos)
查找第一个不属于str字符串的字符find_last_of(str,pos)
查找最后一个属于str的字符find_last_not_of(str,pos)
查找最后一个不属于str的字符string str="1234567890"; //数字
string s="aaa666aaa";
cout<<s.find_first_of(str)<<endl; //第一个数字,下标为3
cout<<s.find_first_not_of(str)<<endl; //第一个非数字,下标0
cout<<s.find_last_of(str)<<endl; //最后一个数字,下标5
cout<<s.find_last_not_of(str); //最后一个非数字,下标8
输出
3
0
5
8