之前说过 string和vector一样,也是一种顺序容器,并且它也自带成员函数,用法和vector的成员函数差不多,不过它只能用来存放字符,也就是字符串。
在c++中,<string>基本上已经包含在<iostream>里面了,但即便如此,在我们用到string类的时候还是要加上头文件<string>的。
下面介绍一下string对象常用的成员函数。
1.构造函数,有三个常用的
(1) string str1="hello world";
(2) string str2("abcde");
(3) string *str3=new string("12343543");
2. 获取字符串长度
int len1=str1.length(); //获取字符串长度
int len2=str1.size(); //获取string这个容器对象中元素的个数
3. 用 '+' 串联字符串
在<string>头文件里对 '+' 进行了重载,可以用来串联字符串
string str4=str1+str2+str3;
4. [ ] 随机访问
在<string>头文件里对 [ ] 进行了重载,可以用来对字符串对象进行随机访问str1[3],包括存取甚至修改操作,类似于数组。
5. 常用的成员函数
push_back();向string容器的末尾位置添加字符
push_pop(); 把string容器里的末尾元素弹出容器,即删除操作
begin();返回一个指向容器中第一个元素的迭代器
end();返回一个指向容器中最后一个元素的下一个位置的迭代器
rebegin();反向迭代,返回指向最后一个元素的下一个位置的迭代器
rend(); 反向迭代,返回指向第一个元素的的迭代器
front();返回容器中第一个元素的引用,可以对其进行存取及修改操作
back();返回容器中最后一个元素的引用,可以对其进行存取及修改操作
at();此成员函数有参数,参数是下标。的作用类似于[ ]操作符,用来对指定下标位置的元素进行随机访问,可进行存取及修改操作
resize(int n, char c);调整容器有效数据尺寸,若尺寸变大,则自动截掉多余的数据;若尺寸变大,则空出的用该函数的第二个参数填充,会影响容器的size。
reserve();为容器预留足够的空间,避免了不必要的重复分配,分配空间大于等于函数的参数,会影响capacity
find(str, int start);<string>文件对find()进行了重载。在只有一个参数的时候表示在当前字符串里查找某个字符或某个子串,查找成功返回首次出现的位置,查找不成功返回-1。
在有第二个参数的时候且该参数是int型,即指定了查找的起始位置start,表示从该位置start开始查找。
copy();用于拷贝。原型为:int copy(char* buffer, int n, int start ) const;把当前字符串中以start位置开始的n个字符复制到到以buffer为起始位置的字符数组中,返回实际拷贝的数目
str1.swap(str2);交换字符串str1和str2
clear();清空当前string容器
empty();判断容器是否为空,为空返回1,非空返回0
c_str();返回一个以NULL结束的c语言字符串。原型为:const char* c_str()const;
erase();删除字符串中的字符,它既可以通过下标也可以通过迭代器来删除指定位置处的字符,甚至可以删除某个区间内的所有字符。由于erase()有多种重载,所以给出了具体用法,看下面代码
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int main() 6 { 7 string str1("123456789"),str2("987654321"); 8 str1.erase(6,1); //第一个参数为起始删除位置,第二个参数为删除的元素个数。即从下标为6的位置开始删除,删除1个元素 9 cout<<str1<<" "; 10 str1.erase(6,2); //第一个参数为起始删除位置,第二个参数为删除的元素个数。即从下标为6的位置开始删除,删除2个元素 11 cout<<str1<<" "; 12 str1.erase(1); //从下标为1的位置开始删除,删除下标为1及1之后的所有元素 13 cout<<str1<<" "; 14 15 string::iterator iter1,iter2; 16 iter2=str2.end()-1; 17 str2.erase(iter2); //删除迭代器所指位置的元素 18 cout<<str2<<" "; 19 iter1=str2.begin(); 20 iter2=str2.begin()+4; 21 str2.erase(iter1,iter2); //删除两个迭代器所指元素之间的所有元素 22 cout<<str2<<" "; 23 return 0; 24 }
结果如下:
insert();向当前字符串中指定位置处插入另外一个字符串,insert()有多种重载,具体用法看代码
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int main() 6 { 7 string str1("123456789"),str2("abcde"); 8 9 str1.insert(8,str2); //把str2插入到str1中下标为8的位置,第一个参数8是插入位置 10 cout<<str1<<" "; 11 str1.insert(4,"hello world"); //把指定字符串插入到str1中下标为4的位置 12 cout<<str1<<" "; 13 14 str1.insert(3,"nihao",4); //在str1中下标为3的位置插入字符串的前4个字符 15 cout<<str1<<" "; 16 17 str1.insert(1,str2,0,3); //把str2中下标从0开始的前3个字符插入到str1中 18 cout<<str1<<" "; 19 20 string::iterator iter1,iter2,iter3; 21 iter1=str2.begin(); 22 str2.insert(iter1,'6'); //在iter1所指的位置插入字符'6' 23 cout<<str2<<" "; 24 iter1=str2.end()-1; 25 str2.insert(iter1,3,'8'); //在iter1所指的位置插入3个字符'8' 26 cout<<str2<<" "; 27 28 string str3("xyz"); 29 iter1=str2.end()-1; 30 iter2=str3.begin(); 31 iter3=str3.end()-1; 32 str2.insert(iter1,iter2,iter3); //把iter2和iter3所指位置之间的所有字符都插入到str2中iter1所指的位置 33 cout<<str2<<" "; 34 return 0; 35 }
结果如下: