一、在C++中的详细说明
string是C++标准库的一个重要的部分,主要用于字符串处理。可以使用输入输出流方式直接进行操作,也可以通过文件等手段进行操作。同时C++的算法库对string也有着很好的支持,而且string还和c语言的字符串之间有着良好的接口。虽然也有一些弊端,但是瑕不掩瑜。
二、string的用法
使用标准C++中string类,必须要包含
#include <string>
1.string的定义与初始化
(1)基本初始化
-
string(const char *s); //用c字符串s初始化,字面体
-
string(string n); //拷贝
-
string(int n,char c); //用n个字符c初始化
-
string(char *s,n) //对字符串s的前pos进行拷贝
-
string(string s,pos) //对字符串的第n个起进行拷贝
-
string(string s,pos,n) //从string的pos起拷贝n个
-
string s1;string s2=“hello”; //定义一个空字符串,然后进行拷贝初始化
-
strign n=string m;
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;//默认初始化
string s1="qqqqq"; //拷贝初始化
string s2("wwww");//s2字面值,是“wwww”的副本
string s3(s1);//是s1的副本
string s4=s1;//是s1的副本
string s5(10,'c');//s5是10个c填充
//string s(cp,n)
char cs[]="12345";
string s7(cs,3);//复制字符串cs的前3个字符到s当中
//string s(s2,pos2)
string s8="asac";
string s9(s8,2);//从s2的第二个字符开始拷贝,不能超过s2的size
//string s(s2,pos2,len2)
string s10="qweqweqweq";
string s11(s10,3,4);//s4是s3从下标3开始4个字符的拷贝,超过s3.size出现未定义
cout <<s1<<" "<<s2<<" "<<s3<<" "<<s4<<" "<<s5<<endl;
cout <<s7<<" "<<s9<<" " <<s11<<endl;
return 0;
}
当构造的string太长而无法表达时会抛出length_error异常 ;
(2)赋值与拷贝操作
-
string &operator=(const string &s);//把字符串s赋给当前字符串
-
string &assign(const char *s);//用c类型字符串s赋值
-
string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值
-
string &assign(const string &s);//把字符串s赋给当前字符串
-
string &assign(int n,char c);//用n个字符c赋值给当前字符串
-
string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串
-
string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部分赋给字符串
使用assign将string转换为vector是错误的
详情见下:
string与vector的转换
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string a="hello";
string b="world";
string c,d,e;
vector<char> data;
c=a;
cout<<"c="<<a<<endl;
d.assign(10,'a');
cout<<"d="<<d<<endl;
e.assign(a,3,1);
cout <<"e="<<e<<endl;
//data.assign(a.begin(),a.end());//不行的
d.assign(a.begin(),a.end());
cout<<d<<endl;
}
2.string的状态
(1)大小
- void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分
- int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数)
- int max_size()const; //返回string对象中可存放的最大字符串的长度
- int size()const; //返回当前字符串的大小
- int length()const; //返回当前字符串的长度
(2)判断
- bool empty()const; //当前字符串是否为空
- bool operator==(const string &s1,const string &s2)const;//比较两个字符串是否相等
运算符">","<",">=","<=","!="均被重载用于字符串的比较; - int compare(const string &s) const;//比较当前字符串和s的大小
- int compare(int pos, int n,const string &s)const;//比较当前字符串从pos开始的n个字符组成的字符串与s的大小
- int compare(int pos, int n,const string &s,int pos2,int n2)const;//比较当前字符串从pos开始的n个字符组成的字符串与s中
- int compare(const char *s) const;
- int compare(int pos, int n,const char *s) const;
- int compare(int pos, int n,const char *s, int pos2) const;
compare函数在>时返回1,<时返回-1,==时返回0
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a="hello";
string b(10,'a');
cout << a.size()<<endl; //结果5
a.resize(10,'c');
cout<< a.size()<<endl; //结果10
cout<< a.capacity()<<endl;//结果:15
cout<<a.length()<<endl;//结果:10
cout<< a.max_size()<<endl;//结果:2147483647
cout<<a.empty();//结果:0
}
3.对string中的字符操作
(1)对string的插入字符操作与连接操作
-
insert()
string类的插入函数: string &insert(int p0, const char *s); //第p0个位置,插入字符串s(以1为开始) string &insert(int p0, const char *s, int n); string &insert(int p0,const string &s); string &insert(int p0,const string &s, int pos, int n); //前4个函数在p0位置插入字符串s中pos开始的前n个字符 string &insert(int p0, int n, char c);//此函数在p0处插入n个字符c iterator insert(iterator it, char c);//在it处插入字符c,返回插入后迭代器的位置 void insert(iterator it, const_iterator first, const_iterator last);//在it处插入[first,last)之间的字符 void insert(iterator it, int n, char c);//在it处插入n个字符c
-
连字符+
(2)对string的删除操作
-
erase()
string类的删除函数 iterator erase(iterator first, iterator last);//删除[first,last)之间的所有字符,返回删除后迭代器的位置 iterator erase(iterator it);//删除it指向的字符,返回删除后迭代器的位置 string &erase(int pos = 0, int n = npos);//删除pos开始的n个字符,返回修改后的字符串
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a="hello";
a.insert(5," world");
cout<<a<<endl;//结果hello world
a.erase(5,6);
cout<<a<<endl;//结果hello
a.insert(5,"world",4);
cout<<a<<endl;//结果helloworl
a.insert(5,5,'a');
cout<<a<<endl;//结果helloaaaaaworl
string b="hello hi";
b.insert(b.end(),b.begin(),b.end());
b.erase(b.begin()+8,b.end());//erase前包括后不包括
cout<<b<<endl;//结果hello hi
b.insert(b.end(),1,'a');
b.erase(b.end()-1);//end()函数
cout<<b<<endl;//结果hello hi
}
(3)获得string的字符
-
[pos] //下标位置获得单个字符
char &operator[](int n);//返回的是单个字符 const char &operator[](int n)const;
-
at(pos) //获取小标位置的单个字符
const char &at(int n)const; char &at(int n);
-
substr(pos,n); //pos是下标位置,n是要获取数据的个数,返回字符串
总结:
substr()返回字符串,会提供范围检测。
operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。
若pos的值超过了string的大小,则substr函数会抛出一个out_of_range异常;
若pos+n的值超过了string的大小,则substr会调整n的值,只拷贝到string的末尾。
(4)对string的查找操作
-
find函数主要是查找一个字符串是否在调用的字符串中出现过,大小写敏感。
-
rfind函数就是找最后一个出现的匹配字符串,返回的位置仍然是从前往后数的
-
[]
string类的查找函数: int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置 int find(const char *s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置 int find(const char *s, int pos, int n) const;//从pos开始查找字符串s中前n个字符在当前串中的位置 int find(const string &s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置 //查找成功时返回所在位置,失败返回string::npos的值 int rfind(char c, int pos = npos) const;//从pos开始从后向前查找字符c在当前串中的位置 int rfind(const char *s, int pos = npos) const; int rfind(const char *s, int pos, int n = npos) const; int rfind(const string &s,int pos = npos) const; //从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,成功返回所在位置,失败时返回string::npos的值 int find_first_of(char c, int pos = 0) const;//从pos开始查找字符c第一次出现的位置 int find_first_of(const char *s, int pos = 0) const; int find_first_of(const char *s, int pos, int n) const; int find_first_of(const string &s,int pos = 0) const; //从pos开始查找当前串中第一个在s的前n个字符组成的数组里的字符的位置。查找失败返回string::npos int find_first_not_of(char c, int pos = 0) const; int find_first_not_of(const char *s, int pos = 0) const; int find_first_not_of(const char *s, int pos,int n) const; int find_first_not_of(const string &s,int pos = 0) const; //从当前串中查找第一个不在串s中的字符出现的位置,失败返回string::npos int find_last_of(char c, int pos = npos) const; int find_last_of(const char *s, int pos = npos) const; int find_last_of(const char *s, int pos, int n = npos) const; int find_last_of(const string &s,int pos = npos) const; int find_last_not_of(char c, int pos = npos) const; int find_last_not_of(const char *s, int pos = npos) const; int find_last_not_of(const char *s, int pos, int n) const; int find_last_not_of(const string &s,int pos = npos) const; //find_last_of和find_last_not_of与find_first_of和find_first_not_of相似,只不过是从后向前查找
(5)对string的修改操作
-
[]
-
replace(char a);
string类的替换函数: string &replace(int p0, int n0,const char *s);//删除从p0开始的n0个字符,然后在p0处插入串s string &replace(int p0, int n0,const char *s, int n);//删除p0开始的n0个字符,然后在p0处插入字符串s的前n个字符 string &replace(int p0, int n0,const string &s);//删除从p0开始的n0个字符,然后在p0处插入串s string &replace(int p0, int n0,const string &s, int pos, int n);//删除p0开始的n0个字符,然后在p0处插入串s中从pos开始的n个字符 string &replace(int p0, int n0,int n, char c);//删除p0开始的n0个字符,然后在p0处插入n个字符c string &replace(iterator first0, iterator last0,const char *s);//把[first0,last0)之间的部分替换为字符串s string &replace(iterator first0, iterator last0,const char *s, int n);//把[first0,last0)之间的部分替换为s的前n个字符 string &replace(iterator first0, iterator last0,const string &s);//把[first0,last0)之间的部分替换为串s string &replace(iterator first0, iterator last0,int n, char c);//把[first0,last0)之间的部分替换为n个字符c string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last);//把[first0,last0)之间的部分替换成[first,last)之间的字符串
4.string的遍历
string类的迭代器处理:
string类提供了向前和向后遍历的迭代器iterator,迭代器提供了访问各个字符的语法,类似于指针操作,迭代器不检查范围。
用string::iterator或string::const_iterator声明迭代器变量,const_iterator不允许改变迭代的内容。常用迭代器函数有:
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第一个字符位置的前面
rbegin和rend用于从后向前的迭代访问,通过设置迭代器string::reverse_iterator,string::const_reverse_iterator实现
5.字符串的其他操作
(1)string类的输入输出操作:
string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作。
函数getline(istream &in,string &s);用于从输入流in中读取字符串到s中,以换行符’\n’分开。
string对字符操作除了使用迭代器,可以使用下标