为什么要用string类
在C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分割开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会造成越界访问。
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个泛型类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。
C++中对于strinig的定义为:typedef basic_string string; 也就是说C++中的string类是一个泛型类,由模板而实例化的一个标准类,本质上不是一个标准数据类型。C++中对于strinig的定义为:typedef basic_string string; 也就是说C++中的string类是一个泛型类,由模板而实例化的一个标准类,本质上不是一个标准数据类型。
总结如下:
- string是表示字符序列的类
- 标准的string提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性
- string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型)
- string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数
string类的常用接口
1.string类对象的常见构造
函数名称 | 功能说明 |
---|---|
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类对象 |
2.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) | 为字符串预留空间 |
size()与length()方法的底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()
clear()只是将string中有效字符清空,不改变底层空间大小
resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时,resize(n)用0来填充多出的元素空间,resize(size_t n,char c)用字符c来填充多出的元素空间
注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是元素个数减少底层空间大小不改变
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小
3.string类的访问操作
函数名称 | 功能说明 |
---|---|
char& operator[] (size_t pos) | 返回pos位置的字符,const string类对象调用 |
const char& operator[] (size_t pos) const | 返回pos位置的字符,非const string类对象调用 |
4.string类对象的修改操作
函数名称 | 功能说明 |
---|---|
void push_back(char c) | 在字符串后尾插字符c |
string& append(const char* s) | 在字符串后追加一个字符串 |
string& operator+=(const string& str) | 在字符串后追加字符串str |
string& operator+=(const char* s) | 在字符串后追加c个数字符串 |
string& operator+=(char c) | 在字符串后追加字符c |
string& char* c_str() cosnt | 返回C格式字符串 |
size_t find(char c,size_t pos = 0)const | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
size_t rfind(char c,size_t pos=npos) | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
string substr(size_t pos=0,size_t n=npos) const | 在str中从pos位置开始,截取n个字符,然后将其返回 |