從定義可知, string其實是base_string的特化類,string使用預設的記憶體配置設定器__STL_DEFAULT_ALLOCATOR(_CharT)。
而traits是c++中一個重要特性,使用traits可在編譯器确定類型相關的資訊。比如某個模闆參數是否為整形。string中預設的模闆參數_Traits為char_traits<_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
string的記憶體結構類似于vector,由一段連續的記憶體緩沖區組成,_M_start為已用緩沖區的首位址,_M_finish為已用緩沖區的尾位址,_M_end_of_storage為空閑緩沖區的尾位址, 如下圖所示

因為string的API和vector類似,是以方法也類似, 此處略過
執行clear時,string占用的記憶體并不會釋放,隻是_M_finish = _M_start而已。是以如果需要釋放string記憶體,可執行`str.swap(string())``
執行reserve(len)時,會重新配置設定1+max(size()+len)大小的記憶體緩沖區, 并将舊緩沖區資料複制到新緩沖區,開銷比較大。是以不要随便執行reserve,以免記憶體的重新配置設定複制。當确定某個對象的最大長度時,可使用reserve預配置設定足夠大的記憶體,可避免後續字元串增長導緻記憶體的重新配置設定複制。