在C语言中,一般使用字符数组 char str[]来存放字符 串,但是操作麻烦,容易出错。
C++在STL中加入了string类型,对字符串常用的需求功能进行了封装,使得操作起来更加方便,且不必担心内存是否足够、字符串的长度等问题。
使用string,需要添加string头文件,即#include <cstring>,
同时必须要有using namespace std。
定义string的方法为:string name;
其中,name是字符串变量的名字。例如:string str;
也可以定义的同时初始化,即:string str="abcd"。
1. string 的访问
一种访问 string 的方法,就像普通字符数组一样操作。例如:
string str= "abcd";
for(int i = 0; i < str.length(); i++)
printf("%c",str[i]); // 输出 abcd
如果要读入或者输出整个字符串,一般只能用cin和cout。如果非要用printf输出string,则需要用c_str()函数将string转换成字符数组。例如:
string str;
cin>>str;
cout<<str<<endl;
printf("%s\n",str.c_str());
另一种访问string的方法是通过迭代器,主要与insert()、erase()等函数配合使用。
先定义string迭代器:string::iterator it;
然后就可以通过“*it”来访问string里的每一个字符了,而且string和vector一样,支持直接对迭代器进行加减某个数字,如str.begin()+3等。例如:
string str="abcdefg";
for(string::iterator it = str.begin()+2; it != str.end(); it++)
printf("%c",*it);//输出cdefg
2. string 的运算
字符串可以做“加法”运算。加法是把两个字符串直接拼接起来。例如:
string str1= “ abc “ ,str2= “ xyz “ ,str3;
str3 = str1 + str2;
str1 += str2;
cout << str1 << endl;// 输出 abcxyz
cout << str3 << endl;// 输出 abcxyz
字符串还可以做“关系”运算,是按照字典序比较两个 string 类型的大小。例如:
string str1= “ aa “ ,str2= “ aaa “ ,str3= “ abc “ ;
if(str1 < str2) printf( “ OK1 “ );// 输出 OK1
if(str1 < str3) printf( “ OK2 “ );// 输出 OK2
3. string 的常用函数
(1)length()和size()
用来返回 string 的长度(字符个数),size()与 length()一样,时间复杂度为O(1)。
(2)clear()
用来清空 string 中的所有元素,时间复杂度为O (1)。
(3)substr()
str.substr(pos,len) 返回从 pos 号位置开始、长度为 len 的子串,时间复杂度为O (n)。
(4)insert ()
有多种写法,时间复杂度都是O (n)。
str.insert(pos,string),表示在pos号位置插入字符串string。
举例:
string s = "abcd";
s.insert(1,"hl");
cout << s;
str.insert(it,it2,it3),it为原字符串的欲插入位置,it2和it3为待插入字符串的首尾迭代器(左闭右开区间)。
(5)erase()
可以删除单个元素,也可以删除一个区间内的所有元素,时间复杂度均为O (n)。
删除单个元素用erase(it),it为要删除的元素的迭代器。删除一个区间内的所有元素可以用两种方法。
str.erase(first,last),first为区间的起始迭代器,last为区间的末尾迭代器的下一个地址,也就是左闭右开的区间[first,last)。
举例:
string s = "abcd";
s.erase(s.begin()+2, s.end());
cout << s;//ab
str.erase(pos,length),pos为需要删除的字符串起始位置,length为要删除的字符个数。
举例:
string s = "abcd";
s.erase(1,2);
cout << s;//输出ab
(6)find()和rfind()
str.find(str2),当str2是str的子串时,返回其在str 中第一次出现的位置;否则返回 string::npos。string::npos是一个常数,其本身的值等于-1,但由于是unsigned int类型,因此,也可以认为是unsigned int类型的最大值(4294967295)。
str.find(str2,pos),是从str的pos号位开始匹配str2,返回值同str.find(str2)。
以上两种写法的时间复杂度都是O(n*m),其中n和m分别为str和str2的长度。
(7)replace()
str.replace(pos,len,str2)表示把str从pos号位开始、长度为len的子串替换为str2。
也可以写成str.replace(it1,it2,str2),表示把str的迭代器it1~it2范围内(左闭右开区间)的子串替换为str2。时间复杂度都是O(str.length)。
(8)back()
获取最后一个字符。
string a="abcd";
1.获取字符串最后一个字符
char b=a.back(); //结果为 b='d';
2.修改字符串最后一个字符
a.back()='!'; //结果为 a="abc!";
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com