std :: string是不是std :: vector <char>?

时间:2017-03-26 02:29:49

标签: c++ string vector stl

在c ++ primer 5th,9.2.5中。分配和交换,我读到了这个:

  

元素不移动的事实意味着,除了   字符串,迭代器,引用和指向容器的指针   没有失效。它们指的是与之前相同的元素   交换。

那么,为什么字符串是一个例外?我一直认为字符串是一个向量,是不是真的?

3 个答案:

答案 0 :(得分:5)

你引用的措辞表明字符串不是向量。当您交换两个向量时,迭代器仍然有效并指向新向量。字符串没有类似的要求。这允许字符串使用小缓冲区优化。

比较basic_stringvector可能更合适,因为这些都是在元素类型和分配器上进行参数化的模板。这显示了进一步的差异:basic_string可能仅适用于文字类型。并且basic_string还采用第三个参数,即特征,它决定了比较的完成方式。

哪些字符串与向量有共同点是它们连续存储数据。

答案 1 :(得分:3)

std::string a std::vector。这是一个std::basic_string

答案 2 :(得分:2)

std::string在标头<string>中定义为模板,如下所示:

template< 
    class CharT, 
    class Traits = std::char_traits<CharT>, 
    class Allocator = std::allocator<CharT>
> class basic_string;

vector的定义不同:

template<
    class T,
    class Allocator = std::allocator<T>
> class vector;

所以std::stringvector<char>不一样。

它们的实现方式不同。