string类基本操作介绍

标准库中的string类
字符串是代表字符序列的对象。

标准字符串类通过类似于标准字节容器的接口为此类对象提供支持,但增加了专门设计用于单字节字符字符串的功能。

该字符串类是的一个实例的basic_string类模板使用字符(即字节)作为其性格类型,其默认char_traits和分配器类型(见basic_string的更多信息的模板)。

请注意,此类处理字节独立于所使用的编码:如果用于处理多字节或可变长度字符(如UTF-8)的序列,则此类的所有成员(如length或size)以及它的迭代器仍将以字节为单位(而不是实际的编码字符)进行操作。

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>
    string;
  4. 不能操作多字节或者变长字符的序列。
    在使用string类时,必须包含#include头文件以及using namespace std;

string类常用接口说明
a. string类对象的常见构造

void TestString()
{
    
    
string s1; // 构造空的string类对象s1
string s2("hello"); // 用C格式字符串构造string类对象s2
string s3(s2); // 用s2拷贝构造s3
}

b. string类对象的容量操作

//size(返回字符串的有效长度)
string s1;
s1.size()  //s1有效长度为0
string s2("hello");
s2.size()  //s2有效长度为5
//length
//length与size功能相同,底层实现也几乎相同
//capacity
//capacity返回空间大小(即该对象所占内存大小)
//empty
//empty检测字符串是否为空串,是返回true否则false
//clear
//clear清空有效字符,使用该功能后该字符的size变为了0
//reserve
//reserve预设空间大小,因开空间是一个较为复杂的操作,有时为了提高效率,我们
//可以提前预测空间大小,用reserve提前一次开设完成,避免多次增容.
//resize
//resize设置有效字符的长度,并将增加的内容置为某个字符
//假设s空间足够
s.resize(15,'c');  //若15大于原size,则将size置为15,并将新增的size置为
                    //字符c
s.resize(15);     //将增加的size置为默认的'\0'

注意:

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一
    致,一般情况下基本都是用size()。
  2. clear()只是将string中有效字符清空,不改变底层空间大小。
  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字
    符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的
    元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大
    小,如果是将元素个数减少,底层空间总大小不变。
  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于
    string的底层空间总大小时,reserver不会改变容量大小。

c. string类对象的访问及遍历操作

//operator[]
//返回pos位置的字符,const string类对象调用
//begin
//获取字符串开始位置的迭代器
//end
//获取字符串最后一个字符的下一个位置的迭代器
//rbegin,rend
//与begin,end功能相同,只不过他是以字符串的尾部作为字符串的开始位置的
string s("hello");
s[0];       //'h'     operator[]
s.begin()   //返回s开始位置的地址,即'h的地址'
s.end()     //返回'0'的下一个位置的地址,即'\0'的地址          

d. string类对象的修改操作

//push_back
//尾插一个字符
//append
//尾插一个字符串
//operator+=
//字符串后追加一个字符串或字符
//c_str
//返回c风格的字符串
//find
//从某个位置开始找某个字符的第一次出现的位置并返回,从前往后找
//rfind
//与find功能相同,从后往前找
//substr
//从某个位置开始截取n个字符返回
string s("abcdefg");
s.push_back('h');   //abcdefgh
s.append("ijk");       //abcdefghijk
s+="lm";    //abcdefghijklm
s.find('b');      //返回b的下标
s.substr(3,5);    //截取def
s.substr(3);     //截取defghijklm

注意:

  1. 在string尾部追加字符时,s.push_back© / s.append(1, c) / s += 'c’三种的实现方式差不多,一般
    情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。

e. string类非成员函数
operator+ 尽量少用,因为传值返回,导致深拷贝效率低
operator>> 输入运算符重载
operator<< 输出运算符重载
getline 获取一行字符串(回车结束)
relational operators 大小比较

扫描二维码关注公众号,回复: 11842983 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_45295598/article/details/103085324
今日推荐