string提供字符串的功能,使用时需要引入头文件<string>,string和vector类似,vector是对数组的封装,而string是对字符串的封装。从面向对象角度来讲,C风格字符串是难以操控的。所以STL里提供了面向对象的string封装。
string内部仍然是维护一个char型数组,并且也是以0结尾的。对外提供了字符串操作常用的函数,如append、clear、at、length等操作,并支持复制、赋值等操作,重载了必要的操作符,使用户可以以一个对象的视角;来操作字符串。下面列举几个string主要函数:
append-----附加字符串;
clear-----清空;
capacity-----容量;
size-----实际长度;
length-----实际长度,等同于size函数;
at-----按索引访问字符;
find-----查找一个字符或子串;
rfind-----从后往前查找一个字符或子串;
find_first_of-----查找匹配若干字符串中的一个字符;
find_first_not_of-----查找不匹配若干字符串的一个字符;
find_last_of-----从后往前查找,匹配若干字符串中的一个字符;
find_last_not_of-----从后往前查找,不匹配若干字符中的一个字符;
substr-----取得一个子串;
insert-----插入字符或子串;
replace-----替换字符或子串;
构造string对象可以有以下几种方式:
string str1("LiMing"); //以一个C风格字符串构造
string str2 = "WangHua"; //以一个C风格字符串构造
string str3 ("abcde",5); //参数1是C字符串,参数2是长度
string str4; //空字符串
string str5 = " "; //空字符串
注意:一定不要用NULL来初始化string,否则会让程序崩溃。
1)append/clear
append用于在末尾附加若干字符或字符串,例如:
#include<stdio.h>
#include<string>
using namespace std;
int main()
{
string str;
str.apend("something else"); //附加一个字符串
str.apend("abcde",5); //附加一个字符串:赋值前5个字符
str.apend("abcde",1,3); //附加一个字符串,七点offset=1,长度3,即复制bcd
str.apend(2,'h'); //附加两个h字符
return 0;
}
和vector一样当附加字符是,内部缓冲区size = capacity时会自动扩充缓冲区:先申请一块更大的内存,再把原有数据复制过去。
2)size/capacity/resize/clear/length
string的内部存储原理和vector相同。size用于得到已经存储的字符串长度,capacity表示剩余可用长度。length和size完全相同。
resize用于显式地设置string内部缓冲区的容量capacity,clear用于清空缓存区内的所有字符,如果希望避免append低效问题,可以事先申请一个大缓冲区。
3)at
at用于按索引访问字符,at函数返回的是第一个reference,因为可以用at修改字符串的内容。例如:
str.at(0) = 'K';
char ch = str.at(0);
string页重载了操作符[],作用与at等同,例如:str[0] = 'K';
4)字符串比较
C风格字符串使用strcmp函数进行大小比较,而string重载了所有关系操作符,所以用起来会直观一些。
5)字符串查找
C风格字符串用strstr函数进行子串查找,并不是太方便。string提供若干查找函数,方便里查找操作。
find函数用于查找一个字符或子串,从左到右依次查找,知道第一次匹配时,返回匹配的位置,如果没有查找到任何匹配,则返回-1,。这里说的位置或偏移,是从0开始的,和数组下标法相同。例如:
string str = "LiMing is doing homework";
查找i的位置;
int pos = str.find('i');
源字符串str包括若干个i,第一个i出现的位置是1,所以上面的代码返回就是1.如果要接着往后查找,可以为find指定第二个参数,该参数表示起点位置偏移offset,例如;
int pos = str.find('i',2);
第二个参数为2,表明从位置2开始查找,在查找到str[3]时fai按匹配,所以可以返回3.
find可以直接查找一个子串,例如:
int pos = str.find("ing");
从左到右查找"ing",第一次匹配时返回子串首字符的位置以下代码是在第一次查找的基础上继续往后查找相同字符串:
int pos = str.find("ing",pos+3);
rfind用于从右往左来查找字符或子串,没有匹配返回-1,有匹配则返回子串的首字符的位置。
int pos = str.rfind("ing");
pos = str.rfind("ing",pos-3);
6)substr
substr用于复制部分字串,带两个参数:第一个参数offset表示起始位置,第二个参数len表示要截取的子串长度。第二个参数如果省略则表示一直截取到末尾。
str src("abcdefg");
string str1 = src.substr(4); //返回efg
string str2 = src.substr(4,2); //返回ef
7)insert/replace
insert函数用于向字符串中间插入字符或子串。
string& insert(int pos,const char* str); //在pos出插入str
replace用于替换string中间的一个资产src,替换另一个子串dest。
如果要实现删除子串,也可以借助DoReplace函数来实现,只是将目标字串长度设为0罢了。