大家好,我是苏貝,本篇博客带大家了解C++的string类,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
目录
- 1. 标准库中的string类
- 1.1 string类(了解)
- 1.2 string类的常用接口说明
- (A) string类对象的常见构造函数
- a.string()
- b.string(const char* s)
- c.string(const string& str)
- (B) 迭代器iterators
- a. begin/end
- b.rbegin/rend
- c.cbegin/cend/crbegin/crend
- (C) 容量capacity
- a.size/length
- b.max_size(了解)
- c.capacity
- d.resize
- e.reserve
- f.clear
- g.empty
- h.shrink_to_fit
1. 标准库中的string类
1.1 string类(了解)
- 字符串是表示字符序列的类
- 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
- string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
- string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits 和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
- 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。
总结:
- string是表示字符串的字符串类
- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名,typedef basic_string string;
- 不能操作多字节或者变长字符的序列。
在使用string类时,必须包含#include以及using namespace std;
1.2 string类的常用接口说明
在下面链接中有string类的所有接口信息,但我们后面只了解常用的接口
string
(A) string类对象的常见构造函数
我们只了解上图的(1)(2)(4),其它的根据上图的解释也能看懂
a.string()
这是空参构造,也是默认构造
作用:构造一个空的string对象,对象的长度是0
上图中可以使用cout<<s的原因是string实现了<<运算符重载
b.string(const char* s)
复制由 s 指向的以 null 结尾的字符序列(C 字符串)。
这里的C字符串是指末尾有“\0”的字符串,如字符数组,”aaa”,const char* p=”aa”
c.string(const string& str)
拷贝构造
(B) 迭代器iterators
迭代器是一个行为像指针的类型对象,但不是指针。用typeid来证明迭代器不是指针
a. begin/end
成员函数begin()的返回值是指向string的第一个字符的迭代器。成员函数end()的返回值是指向string的最后一个字符的下一个字符的迭代器。
string的字符串底层一定有表结束的’\0’,因为string的底层就是用C语言的字符数组实现的,C语言的字符串用’\0’作为结束标志。但是我们认为string的最后一个字符是’\0’的前一个字符,因此end()返回的迭代器一般都指向’\0’
它们通常配合遍历操作使用
如果s没有被const修饰,那么可以通过迭代器修改string
begin()和end()也可以用const修饰,如果有const string,那么该string不能被修改,且const string调用begin()/end()时,返回值类型是const_iterator
b.rbegin/rend
rbegin()的返回值是指向string的最后一个字符的反向迭代器。rend()的返回值是指向string的第一个字符的前一个字符的反向迭代器。
注意:反向遍历时,rid还是++而不是–
因此一共有4类迭代器
c.cbegin/cend/crbegin/crend
这四个成员函数都是C++11新增的,其实它们和const修饰的begin/end/rbegin/rend是一样的
© 容量capacity
a.size/length
size()和length()的返回值相同,都是返回string的长度。
注意:它们都不算’\0’
我们一般都用size
b.max_size(了解)
返回string最大可到的长度
最大值是不固定的,可能在某些编译器的某些平台下会是42亿多
c.capacity
返回的是开辟的空间,capacity>=size
d.resize
修改string的长度为n
resize()有3种情况:
-
n<size:删除
-
size<n<capacity:插入
-
n>capacity:扩容+插入
-
n<size,string的长度变为n,删除n之后的数据
- size<n<capacity,string的长度变为n,size以后的元素初始化为形参c,如果没有传形参c,就初始化为’\0’
传参
没传参
- n>capacity,扩容+插入
传参:
不传参
注意:resize用的不多
e.reserve
作用:请求改变capacity。当n>capacity时,扩容,使得capacity>=n。当n<capacity时,不做处理
reserve和反向迭代器的reverse相似,前者是保留,后者是反转
reserve()一般用于知道要插入多少数据,提前开好空间的情况。它避免了扩容,提高效率。相较于resize,reservs用的更多
f.clear
作用:清空string,即删除string的内容,让size==0。但不会销毁空间
g.empty
作用:测试string是否是空的,即测试string的size是否为0
h.shrink_to_fit
作用:请求缩容,但是缩容后的capacity还是要>=size
但是编译器不一定真的会缩容
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️