?2.2 string基本字符系列容器——>要包含string库“include<string>”
????? 相当于字符串类,亦可用vector<char>处理字符串,但功能比不上string,或者vector<string>,相当于c语言中的字符串数组。
?
?1.创建string对象
?类似于用普通数据类型,定义变量一般。
?创建字符串对象时,该字符串是个空字符串,其长度为0。如:
?
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s;
?cout << s.length() << endl ;
?return 0;
}
运行结果是:0
?
?2.两种方式给string对象赋值
?(1)用赋值号直接赋值
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s;
?s="Hello world!!!";?
?cout << s << endl ;
?return 0;
}
运行结果:
Hello world!!!
?(2)更常用的方法是,把字符指针赋给一个字符串对象
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s;
?char ss[5000];
?//scanf的输入速度比cout快得多
?//scanf是C语言中的函数,所以不支持string对象
?scanf("%s",&ss);
?//将整个字符数组赋值给string对象
?s=ss;
?cout << s << endl ;
?return 0;
}
?
?3.从string对象尾部添加? 字符(char),采用“+”操作即可。
?4.从string对象尾部追加字符串
?(1)直接运用“+”caozuofu.html" target="_blank">操作符
?(2)采用append()方法,是类之中的成员函数。<对象>.append(<追加的值参数>);
如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s;
?s="Hello";
?s=s+" ";
?s.append("world");
?s=s+"!!!";
?cout << s << endl;
?return 0;
}
?
?5.给string对象插入字符,可用insert()方法插到迭代器的位置之前,是类之中的成员函数。<对象>.insert(<位置参数>,<插入的值>);
如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s;
?s="Hello";
?s=s+" ";
?s.append("world");
?s=s+"!!!";
?string::iterator it;?/*相当于指针,string之中属性的定义变量*/
?it = s.begin();
?s.insert(it+1,'3');
?cout << s << endl;
?return 0;
}
?
?6.运用下标方式随机访问string对象的元素,下标是从0开始计数的。另外,string对象的元素是一个个字符。此时相当于字符串数组。
如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s;
?s="Hello";
?s=s+" ";
?s.append("world");
?s=s+"!!!";
?string::iterator it;?/*相当于指针,string之中属性的定义变量*/
?it = s.begin();
?s.insert(it+1,'3');
?cout << s << endl;
?cout << s[1] << endl ;
?return 0;
}
?
?7.删除string对象的元素
?(1)清空一个字符串,则直接给他赋空字符串即可;
?(2)使用erase()方法删除迭代器所指的那个元素或者一个区间中的所有元素。已对该函数进行过了重载,所以
<对象>.erase(<所要删除位置的元素的值>);或者<对象>.erase(<所要删除区间的起始元素的值>,<所要删除的元素的最后元素的后一个位置上的元素>);
如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s;
?s="Hello";
?s=s+" ";
?s.append("world");
?s=s+"!!!";
?string::iterator it;?/*相当于指针,string之中属性的定义变量*/
?it = s.begin();
?s.insert(it+1,'3');
?cout << s << endl;
?cout << s[1] << endl ;
?s.erase(it+1);//相当于s.erase(it+1,it+2);
?cout << s << endl;
?s.erase(it+1,it+4);
?cout << s << endl;
?return 0;
}
?
?8.返回string对象的长度
?采用length()方法返回字符串的长度;
?采用empty()方法返回判断字符串是否为空的结果。(空为真,1;不空为假,0.)
?
?9.替换字符——>replace()方法,重载很多。
?<对象>.replace(<起始元素位置>,<从开始元素以后的所替换的元素个数>,<要执行的替换进去的字符串(个数可大可小,不限)>);
?
?10.搜索string对象的元素与子串,find()方法。
?采用find()方法可查找字符串中的第一个字符元素(char,用单引号界定)或者子串(用双引号界定,返回第一个元素的下标值),如果查到,这返回下标值(从0开始计数),如果查不到,则返回4294967295.?
?
?11.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;
}
?
?12.用reverse反向排序string对象
?使用reverse反向排序算法,该函数包含于“#include<algorithm>”.
?reverse(v.begin(),v.end());//头指针到尾指针
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
??? string s;
??? s = "123456789";
??? reverse(s.begin(),s.end());
??? cout << s << endl ;
??? return 0;
}
?
?13.string对象可以作为vector向量的元素,类似于字符串数组。
?
?14.string类型的数字化处理
?在ACM竞赛中,常常需要将读入的数字的每位分离出来,若果采用取余的方法,花费的时间就会太久。
?相比,将读入的数据当成字符串来处理,较方便、省时。
?下面程序演示求一个整数各位的和。
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s;
?s = "123456789";
?int i;
?int sum = 0;
?for(i = 0;i<s.length();i++){
?
??if(s[i]=='0')sum+=0;
??else 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;
}
?15.string对象鱼字符串数组的相互操作
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s;
?char ss[100];
?//输入字符串到字符数组中
?scanf("%s",&ss);
?//字符数组赋值给字符串数组
?s=ss;
?//因为字符串数组不能使用scanf()和printf()函数
?//若要用printf输出字符串对象,要使用c_str()方法
?printf(s.c_str());
?cout << endl ;
?//用printf输出字符数组
?printf("%s",ss);
?cout << endl ;
?cout << s << endl ;
?cout << ss << endl ;
?return 0 ;
}
?
?16.string对象与sscanf函数
?在C语言中,sscanf函数可以把一个字符串按需要的方式分离出子串,甚至是数字。
#include<string>
#include<iostream>
using namespace std;
int main()
{
?string s1,s2,s3;
?char sa[100],sb[100],sc[100];
?//将字符串分离成子串,分隔符为空格
?sscanf("abc 123 pc","%s %s %s",sa,sb,sc);
?s1 = sa ;
?s2 = sb ;
?s3 = sc ;
?cout? << s1 << " " << s2 << " " << s3 << " " << endl ;
?//将字符串分离为数字,分隔符为空格 、“,”和“$”
?//当使用数字的时候,跟scanf一样,他要传指针地址
?int a,b,c,d;
?sscanf("3 4,5$6","%d %d,%d$%d",&a,&b,&c,&d);
?cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
?return 0;
}
?
?17.string对象与数值之间需要相互转换。
#include<string>
#include<iostream>
#include<sstream>
using namespace std;
//c++方法:将数值转换为string
string convertToString(double x)
{
?ostringstream o;
?if(o<<x)
??return o.str();
?return "conversion error";//if error
}
//c++方法:将string转换成数值
double convertFromString(const string &s)
{
?istringstream i(s);
?double x;
?if(i >> x)
??return x;
?return 0.0;//if error.
}
int main()
{
?//将数值转换为string的第一种方法:c方法
?char b[10];
?string a;
?sprintf(b,"%d,1975");
?a=b;
?cout << a << endl;
?//将数值转换为string的第二种方法:c++方法
?string cc = convertToString(1976);
?cout << cc << endl;
?//将string转换为数字的方法:c++方法
?string dd = "2006";
?int p=convertFromString(dd)+2;
?cout << p << endl ;
?return 0;
}