STL-string类

什么是string

string与vector非常相似,专门用于保存字符,随机访问快,在尾部插入或者删除都很快。

为什么需要string类?

      C语言中,字符串是以‘\0’结尾的一些字符的集合,为了方便操作,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不符合OOP的思想,而且需要用户自己管理,稍不留神还可能产生越界访问。

String和c风格字符串对比

  1. Char是一个指针,String是一个类,它封装了char,由它来管理这个字符串,是一个char型的容器。
  2. String封装了很多实用的成员方法,查找find,拷贝copy,删除delete 替换replace,插入insert。
  3. 不用考虑内存释放和越界,string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。
  4. 但是唯一需要额外注意的是:使用string的时候必须包含头文件string以及using namespace std;

构造函数

函数名称功能说明
string()构造空的string类对象,即空字符串
string(const char *s)用C-string来构造string类对象
string(size_t n, char c)string类对象中包含n个字符c
string(const string &s)拷贝构造函数
string(const string&s,size_t n)用s中的前n个字符构造新的string类对象

容量操作

函数名称功能说明
size_t size() const返回字符串有效字符长度
size_t length() const返回字符串有效字符长度
size_t capacity() const返回空间总大小
bool empty() const检测字符串是否为空串,如果是空返回true,否则返回false
void clear()清空有效字符
void resize(size_t n, char c)将有效字符的个数改成n个,多出的空间用字符c填充
void resize(size_t n)将有效字符的个数改成n个,多出的空间用0填充
void reserve(size_t res_arg = 0)为字符串预留空间

结论:

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

访问操作

函数名称功能说明
char &operator[](size_t pos)返回pos位置字符的引用,非const对象调用
const char &operator[](size_t pos)返回pos位置字符的引用,const对象调用
char& at(int n)通过at方法获取字符

      为了修改string字符串的内容,下标操作符[]和at都会返回字符的引用。但当字符串的内存被重新分配之后,可能发生错误.
      []与at的区别:[]访问越界直接挂掉,at会抛出异常。

拼接操作

函数名称功能描述
string& operator+=(const string& str)字符串后追加一个string
string& operator+=(const char c)字符串后追加一个字符
string& operator+=(const char* str)字符串后追加一个c_string
string& append(const char *s)字符串后追加一个c_string
string& append(const char *s, int n)把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s)字符串后追加一个string
string& append(const string &s, int pos, int n)把字符串s中从pos开始的n个字符连接到当前字符串结尾
string& append(int n, char c)在当前字符串结尾添加n个字符
string& push_back(char c)在当前字符串结尾追加字符c

      在string尾部追加字符时,s.push_back()、s.append(1, c)以及s+='c’三种实现方式差不多,一般 使用+=,因为+=不仅可以连接单个字符,还可以连接字符串。

查找和替换

函数名称功能描述
int find(const string& str, int pos = 0) const查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const从pos查找s的前n个字符最后一次位置
int rfind (char c, int pos = npos) const查找字符c最后一次出现位置
string& replace(int pos, int n, const string& str)替换从pos开始n个字符为字符串str
string& replace(int pos, int n, const char* s)替换从pos开始的n个字符为字符串s

插入与删除

函数名称函数功能
string& insert(int pos, const string& str)插入字符串
string& insert(int pos, const char* s)插入字符串
string& insert(int pos, int n, char c)在指定位置插入n个字符c
string& erase(int pos, int n = npos)删除从Pos开始的n个字符

比较操作

函数名称函数功能
int compare(const string &s)const与字符串s比较
int compare(const char *s)与字符串s比较

      compare函数在>时返回 1,<时返回 -1,==时返回 0。比较区分大小写,比较时参考字典顺序,排越前面的越小。

获取子串

函数名称函数功能
string substr(int pos = 0, int n = npos) const返回由pos开始的n个字符组成的字符串

string和c-style字符串转换

函数名称函数功能
const char *c_str()返回C格式字符串
string(char *s)用C-string来构造string类对象

      在c++中存在一个从const char到string的隐式类型转换,却不存在从一个string对象到C_string的自动类型转换。对于string类型的字符串,可以通过c_str()函数返回string对象对应的C_string.
      通常,程序员在整个程序中应坚持使用string类对象,直到必须将内容转化为char
时才将其转换为C_string.
我们可以使用data函数获得不以null结尾的字符串。

非成员函数

函数名称功能描述
operator+()尽量少用,效率低
operator>>()输入运算符重载
operator<<()输出运算符重载
getline获取一行字符串
relational operators大小比较
void test07()
{
	string s;
	getline(cin, s);// 读取一行
	cout << s << endl;
	getline(cin, s, 'a');// 读取数据,直到读到'a'
	cout << s << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值