,下⾯记录⼀下string中⽐较常⽤的⽤法。string的定义及初始化
string s1 = \"hello\"; //初始化字符串string s2 (\"world\"); //另⼀种初始化 string s3; //初始化字符串,空字符串
string s4(5, 'a'); //s4由连续5个a组成,即s4=\"aaaaa\";
string s5(s1,2,3); //从s1的2位置的字符开始,连续3个字符赋值给s5,即s5=\"llo\";
string s6(s1, 1); //从s1的2位置的字符开始,将后续的所有字符赋值给s6,即s6=\"ello\";
string的读⼊
当使⽤C++的cin读⼊字符串时,程序遇到空⽩字符就停⽌读取了。⽐如程序输⼊是:
\" hello world\"
那么当我们使⽤如下代码时,s1得到的只是\"hello\"。
string s1;cin>>s1;
如果我们想读取⼀整⾏输⼊,包括空格及空格后⾯的字符,我们可以使⽤getline。
string str;
getline(cin, str);
cout << str << endl;
重载的运算符
此处列举⼀下被重载的运算符,基本意思⼀⽬了然。其中注意“+”操作
s1 = s2; s1 += s2; s1 = s2 + s3; s1 == s2;
s1 = \"s\" + s2; //正确
s1 = \"s\" + \"s\"; //错误,加号两边⾄少要有⼀个string类型的对象 s1 = \"s\" + s2 + \"s\" + \"s\"; //正确
“+”的两边要保证⾄少有⼀个string类型,所以5正确,6错误。由于在C/C++中,+的返回值还是原类型,所以第7⾏中,\"s\"+s2返回⼀个string类型,因此string+“s”也是正确的,以此类推。
遍历string(迭代器)
遍历string中的元素时,我们可以使⽤类似C中的数组形式访问,如s1[1],也可以使⽤STL特有的迭代器访问:
string::iterator it;
for (it = s1.begin(); it != s1.end(); it++){ cout << *it << endl;}
cout << *(s1.begin()); //正确,即访问s1[0]cout << *(s1.end()); //错误,s1.end()指向了空
若想要从后向前遍历string时,可以⽤到rbegin()和rend()函数。
const_iterator begin()const;
iterator begin(); //返回string的起始位置const_iterator end()const;
iterator end(); //返回string的最后⼀个字符后⾯的位置const_iterator rbegin()const;
iterator rbegin(); //返回string的最后⼀个字符的位置const_iterator rend()const;
iterator rend(); //返回string第⼀个字符位置的前⾯
插⼊insert()
string s1 = \"hello\";
s1.insert(1,\"ins\"); //从s1的1位置开始,插⼊\"ins\"字符串,即s1=\"hinsello\";
s1.insert(1, \"ins\", 2);//从s1的1位置开始,插⼊\"ins\"字符串的前2个字符,即s1=\"hinello\";
s1.insert(1, \"ins\", 1, 2);//从s1的1位置开始,插⼊\"ins\"字符串的从1位置开始的2个字符,即s1=\"hnsello\";iterator insert(iterator it, char c);//在it处插⼊字符c,返回插⼊后迭代器的位置
删除erase()
iterator erase(iterator first, iterator last);//删除[first,last)之间的所有字符,返回删除后迭代器的位置iterator erase(iterator it);//删除it指向的字符,返回删除后迭代器的位置
string &erase(int pos = 0, int n = npos);//删除pos开始的n个字符,返回修改后的字符串
查找 find()
cout << s.find(\"aa\", 0) << endl; //返回的是⼦串位置。第⼆个参数是查找的起始位置,如果找不到,就返回string::nposif (s.find(\"aa1\", 0) == string::npos){
cout << \"找不到该⼦串!\" << endl;}