zoukankan      html  css  js  c++  java
  • STL源码分析--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中默认的模板参数_Traitschar_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为空闲缓冲区的尾地址, 如下图所示

    string的数据结构

    2 string的API

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

    3 string使用时的注意事项

    1. 执行clear时,string占用的内存并不会释放,只是_M_finish = _M_start而已。因此如果需要释放string内存,可执行`str.swap(string())``
    2. 执行reserve(len)时,会重新分配1+max(size()+len)大小的内存缓冲区, 并将旧缓冲区数据复制到新缓冲区,开销比较大。因此不要随便执行reserve,以免内存的重新分配复制。当确定某个对象的最大长度时,可使用reserve预分配足够大的内存,可避免后续字符串增长导致内存的重新分配复制。

    推荐阅读

    更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。
    二维码

  • 相关阅读:
    JAVA基础:JAVA代码编写的30条建议
    Oracle学习之三 程序控制结构
    ExtJs 常用代码片段(7.30更新)
    ExtJs4 之数据模型
    .NET 大杂烩
    .NET 导出Excel
    Javascript实现IE直接打印
    C# Timer用法及实例
    AjaxPro实现无刷新多级联动实例
    VB6.0输入文本写进UTF8格式的文本文件
  • 原文地址:https://www.cnblogs.com/taiyang-li/p/14450482.html
Copyright © 2011-2022 走看看