C语言只提供一个char类型用来处理字符串,而面对字符串,只能通过数组来处理,显得非常不方便。C++STL提供了string基本字符系列容器来处理字符串,可以把string理解为字符串类,它提供添加,删除,替换,查找和比较等丰富的方法。
虽然使用vector这样的向量也可以处理字符串,但功能比不上string。向量元素类型是string,如vector这样的向量也可以处理字符串。
使用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;
}
给string对象赋值
第一种方法直接赋值
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = "hello,C++STL!";
cout << s << endl;
return 0;
}
更常用的一种方法是,把字符指针赋给一个字符串对象:
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
char ss[5000];
//scanf的输入速度比cin快的多
//scanf是C语言的函数,不支持string对象
scanf("%s",&ss);
s = ss;
cout << s << endl;
return 0;
}
从string对象的尾部添加一个字符(char),采用“+”操作符即可,具体应用如下:
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = s + 'a';
s = s + 'b';
s = s + 'c';
cout << s << endl;
return 0;
}
好像java中对字符串也有这种+的操作
从string对象尾部追加字符串
(1)直接采用“+”操作数,代码如下:
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = s + "abc";
s = s + "123";
cout << s << endl;
return 0;
}
(2)采用append()方法,代码如下:
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s.append("abc");
s.append("123");
cout << s << endl;
return 0;
}
感觉append似曾相识,Python中曾用到
访问string对象的元素,下标是从0开始计数的,另外,string对象的元素是一个字符(char),这点一定要清楚。代码如下
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = "abcd123456";
cout << s[0] <<endl;
cout << s[0] - 'a' << endl;
return 0;
}
删除string对象的元素
(1)清空一个字符串,则直接给它赋空字符串即可。
(2)使用erase()方法删除迭代器所指的那个元素或那个区间中的所有元素。代码如下
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = "abc123456";
string::iterator it=s.begin();
s.erase(it+3);
cout << s << endl;
s.erase(it,it+4);
cout << s << endl;
s = "";
cout <<s.length() << endl;
return 0;
}
可以使用insert()方法把一个字符插入到迭代器位置之前(特别注意是之前),代码如下:
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = "123456";
string::iterator it;
it = s.begin();
s.insert(it+1,'p');
cout << s << endl;
return 0;
}
采用length()方法可返回字符串的长度:采用empty()方法,可返回字符串是否为空,如果字符串为空,则返回逻辑真,即1,否则,返回逻辑假。代码如下:
是否为空 1 是 为空
0 不是 空
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = "abc123456";
cout << s.length() << endl;
s = "";
cout << s.empty() << endl;
return 0;
}
替换string对象字符串
使用replace()方法可以方便地替换string对象中的字符,replace()方法的重载函数相当多,常用的只有一个,具体代码如下:
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = "abc123456";
s.replace(3,3,"good");
cout << s << endl;
return 0;
}
从第三个开始,将连续的3个字符串替代为“good”
即将abc之后的三个字符替代为“good”
搜索string对象的元素或者子串
search
采用find()方法可查找字符串中的第一个字符元素(char,用单引号界定),或者子串(用双引号界定),如果查到,则返回下标值(从0开始计数),如果查不到,则返回429467295
find()方法有多种重载函数,下面的代码,仅列举了一种用法
#include<iostream>
#include<string>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = "cat dog cat";
//查找第一个字符'c',返回下标值
cout << s.find('c') << endl;
//查找第一个字符子串
cout << s.find("c") << endl;
//查找第一个子串"cat",返回下标值
cout << s.find("cat") << endl;
//查找第一个子串"dog",返回下标值
cout << s.find("dog") << endl;
//查找第二个子串"dogc",查不到则返回4294967295
cout << s.find("dogc") << endl;
return 0;
}
string对象可以使用compare()方法比较与其他字符串相比,如果它比对方大,则返回1,如果它比对方小,则返回-1,如果它与对方相同,则返回0,代码如下:
#include<string>
#include<iostream>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = "cat dog cat";
//s 比 "cat" 字符串大,返回1
cout << s.compare("cat") << endl;
//s 与 "cat dog cat"相等,返回0
cout << s.compare("cat dog cat") << endl;
//s 比 "dog" 小 返回-1
cout << s.compare("dog") << endl;
return 0;
}
用reserve()方法可将string对象迭代器所指向的一段区间中的元素(字符)反向排序。reserve()方法需要声明头文件 algorithm
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main(int argc,char * argv[])
{
string s;
s = "123456789";
reverse(s.begin(),s.end());
cout << s << endl;
return 0;
}
string对象可以作为vector向量的元素,这种用法,类似于字符串数组。代码如下
相当于是一个多维数组
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
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;
}
这点很重要!!!
在ACM竞赛中,常常需要将读入的数字的每位分离出来,如果采用取余的方法,花费的时间就会很长,这时候,我们就可以将读入的数据当作字符串来处理,这样就方便,而且省时多了。下面这个程序演示了一个求一个整数各位的和
思想:用字符串来表示整数用小标来访问每位数。
这里写代码片