STL源码分析--string
Posted 后端技术小屋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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::length
,basic_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(memmove
和memcpy
作用相似,都用于字节数组的复制,但是后者不允许内存区域有重叠) -
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; }
2 string的API
因为string的API和vector类似,因此方法也类似, 此处略过
3 string使用时的注意事项
-
执行 clear
时,string占用的内存并不会释放,只是_M_finish = _M_start
而已。因此如果需要释放string内存,可执行`str.swap(string())`` -
执行 reserve(len)
时,会重新分配1+max(size()+len)
大小的内存缓冲区, 并将旧缓冲区数据复制到新缓冲区,开销比较大。因此不要随便执行reserve
,以免内存的重新分配复制。当确定某个对象的最大长度时,可使用reserve
预分配足够大的内存,可避免后续字符串增长导致内存的重新分配复制。
以上是关于STL源码分析--string的主要内容,如果未能解决你的问题,请参考以下文章
STL源码拆解基于源码分析forward_lsit容器实现(详细!)
STL源码拆解基于源码分析forward_lsit容器实现(详细!)