Hello大家好! 很高兴与大家见面! 给生活添点快乐,开始今天的编程之路。

我的博客:<但愿.

我的专栏:C语言题目精讲算法与数据结构C++

欢迎点赞,关注

目录

   一、 string类解读

  二  string类的常见接口说明【注意是常见重要接口,想了解全部可以搜索网站:cplusplus】

               2.1string类对象的常见构造   

               2.2stinrg类对象的容量操作

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

               2.4string类对象的修改操作

               2.5 string类非成员函数

   三    vs和g++下string结构的说明

               3.1 vs下string的结构

               3.2  g++下string的结构

               

一、 string类解读

string类文档(参考网站:cplusplus)

具体如下:

以下翻译只做参考。

1字符串是代表字符序列的对象。

2标准字符串class standard container为此类对象提供与字节标准容器类似的接口,但会添加专门设计用于使用单字节字符串操作的功能。

3string类是使用 basic_stringbasit_string 类模板的实例化焦糖(即字节)作为其字符类型,包含默认的 char_traitsallocator 类型(在模板中查看 basity_string 以获取更多信息)。

注意这个类处理的字节与所使用的编码无关:如果用于处理多字节或可变长度字符(例如UTF-8)的序列,则这个类的所有成员(length例如长度或大小)及其迭代器仍会以字节(而不是实际编码字符)进行操作。

二  string类的常见接口说明【注意是常见重要接口,想了解全部可以搜索网站:cplusplus】

2.1string类对象的常见构造

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

2.2stinrg类对象的容量操作

函数名称
功能说明
size(重点)
返回字符串有效字符长度
length
返回字符串有效字符长度
capacity
返回空间总大小
empty  (重点)
检测字符串释放为空串,是返回true,否则返回false
 clear(重点)
清空有效字符
reserve(重点)
为字符串预留空间**
resize(重点)
将有效字符的个数该成n个,多出的空间用字符c填充

1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接
口保持一致,一般情况下基本都是用size(),length()只适用于字符串底层是数组的对象。
 
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不一定(不同编译器可能不同在计算机中把不确定当作不能,所以该函数一般只用于扩容)会改变容量大小。

代码演示:

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

函数名称
功能说明
operator[] (重 点)
返回pos位置的字符,const string类对象调用
begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围for
C++11支持更简洁的范围for的新遍历方式

代码演示:

2.4string类对象的修改操作
 

函数名称
功能说明
在字符串后尾插字符c
在字符串后追加一个字符串
operator+= (重点)
在字符串后追加字符串str
c_str(重点)
返回C格式字符串
find + npos(重点)
从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
在str中从pos位置开始,截取n个字符,然后将其返回

小秘诀:

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

2.5 string类非成员函数

函数
功能说明
尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)
输入运算符重载
operator<<(重点)
输出运算符重载
getline (重点)
获取一行字符串
relational operators (重点)
大小比较

代码演示:

三    vs和g++下string结构的说明

注意:下述结构是在32位平台下进行验证,32位平台下指针占4个字节

3.1 vs下string的结构

string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义
string中字符串的存储空间
当字符串长度小于16时,使用内部固定的字符数组来存放
当字符串长度大于等于16时,从堆上开辟空间
union _Bxty
{ // storage for small buffer or pointer to larger one
value_type _Buf[_BUF_SIZE];
pointer _Ptr;
char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;
这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。
其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量
最后:还有一个指针做一些其他事情。
故总共占16+4+4+4=28个字节

3.2  g++下string的结构

G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:
(1)空间总大小
(2)字符串有效长度
(3)引用计数
struct _Rep_base
{
size_type _M_length;
size_type _M_capacity;
_Atomic_word _M_refcount;
};

本篇文章就到此结束,欢迎大家订阅我的专栏,欢迎大家指正,希望有所能帮到读者更好理解C++相关知识 ,觉得有帮助的还请三联支持一下~后续会不断更新C/C++相关知识,我们下期再见。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐