STL源码分析--string

简介: STL源码分析--string
  • 1 string的数据结构


  • 2 string的API


  • 3 string使用时的注意事项


1 string的数据结构


从定义可知, string其实是base_string的特化类,string使用默认的内存分配器__STL_DEFAULT_ALLOCATOR(_CharT)


template <class _CharT, 
          class _Traits = char_traits<_CharT>, 
          class _Alloc = __STL_DEFAULT_ALLOCATOR(_CharT) >
class basic_string;
typedef basic_string<char>    string;



traits是c++中一个重要特性,使用traits可在编译器确定类型相关的信息。比如某个模板参数是否为整形。string中默认的模板参数_Traits


char_traits<_CharT>, 定义如下


template <class _CharT> class char_traits
  : public __char_traits_base<_CharT, _CharT>
{}



可以看到char_traits<_CharT>继承自__char_traits_base<_CharT, _CharT>,其中定义了字符类型_CharT的各种操作,供basic_string方法调用:例如basic_string::operator=中调用了__char_traits_base::lengthbasic_string::clear中调用了__char_traits_base::assign



以下是一些常见的字符操作


  • assign: 复制字符值


  • eq: 相等


  • lt: 小于


  • compare: 比较(小于返回-1, 等于返回0, 大于返回1)


  • length: 字符数组的长度(需以null char值结尾)


  • find: 寻找某个字符值


  • move: 调用memmove复制字符数组A到B


  • copy: 调用memcpy复制字符数组A到B(memmovememcpy作用相似,都用于字节数组的复制,但是后者不允许内存区域有重叠)


  • eof: 字符值是否等于-1


static void assign(char_type& __c1, const char_type& __c2) { __c1 = __c2; }
  static bool eq(const _CharT& __c1, const _CharT& __c2) 
    { return __c1 == __c2; }
  static bool lt(const _CharT& __c1, const _CharT& __c2) 
    { return __c1 < __c2; }


string的内存结构类似于vector,由一段连续的内存缓冲区组成,_M_start为已用缓冲区的首地址,_M_finish为已用缓冲区的尾地址,_M_end_of_storage为空闲缓冲区的尾地址, 如下图所示

e391db16e46759db05075037e218fc63.png



2 string的API


因为string的API和vector类似,因此方法也类似, 此处略过



3 string使用时的注意事项


  1. 执行clear时,string占用的内存并不会释放,只是_M_finish = _M_start而已。因此如果需要释放string内存,可执行`str.swap(string())``


  1. 执行reserve(len)时,会重新分配1+max(size()+len)大小的内存缓冲区, 并将旧缓冲区数据复制到新缓冲区,开销比较大。因此不要随便执行reserve,以免内存的重新分配复制。当确定某个对象的最大长度时,可使用reserve预分配足够大的内存,可避免后续字符串增长导致内存的重新分配复制。





相关文章
|
2天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
16 0
|
2天前
|
存储 缓存 安全
【 Java中String源码分析(JVM视角你不来看看?】
【 Java中String源码分析(JVM视角你不来看看?】
14 0
|
2天前
|
C++ 容器
STL—vector、string
STL—vector、string
|
2天前
|
算法 Linux C语言
【C++进阶(一)】STL大法以及string的使用
【C++进阶(一)】STL大法以及string的使用
|
2天前
|
存储 算法 C语言
c++的学习之路:9、STL简介与string(1)
c++的学习之路:9、STL简介与string(1)
22 0
|
2天前
|
存储 编译器 C++
【C++初阶】STL详解(二)string类的模拟实现
【C++初阶】STL详解(二)string类的模拟实现
54 1
|
2天前
|
存储 算法 编译器
【C++初阶】STL详解(一)string类
【C++初阶】STL详解(一)string类
31 0
|
2天前
|
存储 算法 C语言
【C++初阶】8. STL初阶 + String类
【C++初阶】8. STL初阶 + String类
54 1
|
2天前
|
C++
【C++STL基础入门】string类的基础使用
总之,`string`类是C++中用于操作字符串的重要工具,提供了丰富的方法来进行字符串操作、查找、替换等操作,简化了字符串处理的任务。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
11 0
|
2天前
|
编译器 C++ 容器
【C++练级之路】【Lv.6】【STL】string类的模拟实现
【C++练级之路】【Lv.6】【STL】string类的模拟实现