C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,他提供了添加删除,替换,查找和比较等丰富的方法;
虽然使用vector<string> 这样的向量也可以处理字符串,但功能比不上string。向量的元素类型可以是string,如vector<string>这样的向量,实际上就类似于C语言中的字符串数组;
使用string容器,需要包含头文件声明#include <string> ;
***创建string对象***
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
string s;
cout << s.length() << endl;
return 0;
}
The result of the program is : 0
***给string对象赋值***
一般有两种方式:
1>. 直接给字符串对象赋值;
Like This :
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s = "Hello, C++STL!";
cout << s << endl;
return 0;
}
2>.更常用的方法是,把字符指针赋给一个字符串对象;
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s;
char ss[200];
cin >> ss;
s = ss;
cout << s << endl;
return 0;
}
***尾部追加一个字符***
在string尾部追加一个字符(char), 采用“+”操作符即可:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s;
s += ‘a‘;
s += ‘b‘;
s += ‘c‘;
cout << s << endl;
return 0;
}
Output : abc
***尾部追加字符串***
一般有两种方法:
1>. 直接采用“+”操作符;
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s;
s += "abc";
s += "123";
cout << s << endl;
return 0;
}
Output : abc123
2>. 采用append()方法,代码如下:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s;
s.append("abc");
s.append("123");
cout << s << endl;
return 0;
}
***访问string对象的元素***
一般使用下标的方式随机访问string对象的元素,下标是从0开始计数的,另外,string对象元素是一个字符(char), 这点一定要清楚;
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s = "abc123456";
cout << s[0] << endl; //输出对象的首元素
cout << s[0] - ‘a‘ << endl; //两个相等的字符相减为0;
return 0;
}
***删除string对象的元素***
1>. 清空一个字符串,则直接给他赋空字符串即可;
2>. 使用erase()方法删除迭代器所指的那个元素或一个区间的所有元素;代码如下:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s = "abc123456";
string::iterator it = s.begin(); //定义迭代器变量,指向字符串对象首元素;
s.erase(it+3); //删除第三个元素,元素从位置0开始计数;
cout << s << endl;
s.erase(it, it+4); //删除区间[0, 4)内所有元素的值;
cout << s << endl;
s = ""; //清空字符串,或者直接用s.clear();
cout << s.length() << endl; //输出字符串的长度;
return 0;
}
不定义迭代器也可以,直接用s.begin()表示;
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s = "abc123456";
s.erase(s.begin()+3); //删除第三个元素,元素从位置0开始计数;
cout << s << endl;
s.erase(s.begin(), s.begin()+4); //删除区间[0, 4)内所有元素的值;
cout << s << endl;
s = ""; //清空字符串;
cout << s.length() << endl; //输出字符串的长度;
return 0;
}
运行结果:
abc23456
3456
0
注意:删除某区间内的所有元素,删除的元素是前开后并,如s.erase(it, it+4) 删除的元素是下标小于4且下标大于等于0的所有元素;
****判断是否为空****
采用length()方法可返回字符串的长度,采用empty()方法,可返回字符串是否为空,如果字符串为空,则返回逻辑真,即1;否则,返回逻辑假,即0;
代码如下:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s = "abc123456";
cout << s.length() << endl;
cout << s.empty() << endl;
s.clear(); //或者是 s = "";
cout << s.empty() << endl;
return 0;
}
运行结果:
9
0
1
****给string对象插入字符****
可以使用insert()方法插入到迭代器位置之前,代码如下:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s = "123456";
string::iterator it = s.begin(); //定义一个迭代器,也可以不定义;
s.insert(it+1, ‘k‘); //把字符‘k’插入到第一个字符的前面(注意,字符位置是从0开始计数的)
s.insert(s.begin()+2, ‘a‘); 把字符‘a‘插入到第二个元素的前面;
s.insert(s.end(), ‘y‘); //把字符‘y‘插入到最后一个字符的后面;
cout << s << endl;
return 0;
}
运行结果:1ka23456y
****替换string对象字符****
采用replace()的方法可以很方便的替换string的对象中的字符,replace方法的重载函数相当多常用的只有一两个,具体代码如下:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s = "abc123456";
s.replace(3, 3, "Kesha"); //从第三个开始,将连续的3个字符替换成“Kesha”;将“abc”换成“Kesha”;
cout << s << endl;
return 0;
}
运行结果:abcKesha456
****搜索string对象的元素或子串****
采用find()方法可查找字符串中第一个字符元素(char, 用单引号界定),或者子串(用双引号界定),如果查到,则返回其下标值(从0开始计数),如果查不到,则返回4294967295;
find()方法有很多重载函数,下面的代码只是其中一种用法:
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s = "cat dog cat";
cout << s.find(‘c‘) << endl; //查找第一个字符‘c‘,返回其下标值;
cout << s.find(‘d‘) << endl; // 查找第一个字符‘d‘,返回其下标值;
cout << s.find("c") << endl; //查找第一个子串"c",返回其下标值;
cout << s.find("cat") << endl; //查找第一个子串"cat",返回其下标值;
cout << s.find("dog") << endl; //查找第一个子串"dog",返回其下标值;
cout << s.find("dogc") << endl; //查不到,返回4394967295;
return 0;
}
运行结果:
0
4
0
0
4
4394967295
****reverse反向排序string对象的元素****
采用reverse()函数可将string对象迭代器所指向的一段区间中的元素(字符)反向排序,reverse()方法必须包含头文件include <algorithm>; 代码如下:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
string s = "0123456789";
reverse(s.begin(), s.end());
cout << s << endl;
return 0;
}
运行结果: 9876543210
**** string对象作为vector元素****
string对象可以vector向量的元素,这种用法,类似于字符串数组,代码如下:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(int argc, char *argv[])
{
vector <string> v;
v.push_back("Jack");
v.push_back("Mike");
v.push_back("Tom");
cout << v[0] << endl;
cout << v[1] << endl;
cout << v[2] << endl;
cout << v[0][0] << endl;
cout << v[1][0] << endl;
cout << v[2].length() <<endl;
return 0;
}
运行结果:
Jack
Mike
Tom
J
M
3
**** string类型数字化处理****
在ACM比赛中,常常需要将读入的数字的每位分离出来,如果采用取余的方法,花费的时间就会太长,这时候,我们可以将读入的数据当成字符串来处理,这样就方便了很多,省时了很多,下面这个程序主要功能是求出一个整数各位的和;
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string s;
while(cin >> s) {
int sum = 0;
for(int i=0; i<s.length(); i++) {
if(s[i] == ‘1‘) sum += 1;
else if(s[i] == ‘2‘) sum += 2;
else if(s[i] == ‘3‘) sum += 3;
else if(s[i] == ‘4‘) sum += 4;
else if(s[i] == ‘5‘) sum += 5;
else if(s[i] == ‘6‘) sum += 6;
else if(s[i] == ‘7‘) sum += 7;
else if(s[i] == ‘8‘) sum += 8;
else if(s[i] == ‘9‘) sum += 9;
}
cout << sum << endl;
}
return 0;
}
Sample Input: 1234059
Sample Output: 24
当然有更加直接的办法将数字字符转换为数字:
for(int i=0; i<s.size(); i++) {
sum += (s[i]-‘0‘);
}
此代码与上述for循环的功能一样,都是求一串数字各位的和;
**** string对象与sscanf函数****
在C语言中,sscanf函数很管用,他可以把一个字符串按你需要的方式分理出子串,甚至是数字,下面这个程序演示了sscanf函数的具体用法:
运行结果为:
abc <> 123 <> pmc
abc >< 123 >< pmc
1 & 2 & 3
4 ~ 5 ~ 6
#include <iostream>
#include <string>
#include <cstdio>
using namespace std;
int main(int argc, char *argv[])
{
string s1, s2, s3;
char sa[100], sb[100], sc[100];
//将字符串分离成子串,分隔符为空格;
sscanf("abc 123 pmc", "%s %s %s", sa, sb, sc);
cout << sa << " <> " << sb << " <> " << sc << endl;
s1 = sa, s2 = sb, s3 = sc;
cout << s1 << " >< " << s2 << " >< " << s3 << endl;
//将字符串分离成数字,分隔符为空格;
//当用到数字的时候,跟scanf一样,他要传递指针地址;
int a, b, c;
sscanf("1 2 3", "%d %d %d", &a, &b, &c);
cout << a << " & " << b << " & " << c << endl;
//将字符串分离成数字,分隔符为“,”和“$”;
//当用到数字的时候,跟scanf一样,他要传递指针地址;
int x, y, z;
sscanf("4, 5$6", "%d,%d$%d", &x, &y, &z);
cout << x << " ~ " << y << " ~ " << z << endl;
return 0;
}