C++ STL之string的用法与简单使用

一、在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对字符操作除了使用迭代器,可以使用下标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值