【问题标题】:Isn't a std::string a std::vector<char>?std::string 不是 std::vector<char> 吗?
【发布时间】:2017-03-26 02:29:49
【问题描述】:

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

元素没有被移动的事实意味着,除了 字符串、迭代器、引用和指向容器的指针是 未作废。它们引用与以前相同的元素 交换。

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

【问题讨论】:

    标签: c++ string vector stl


    【解决方案1】:

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

    比较basic_stringvector 可能更合适,因为它们都是根据元素类型和分配器参数化的模板。这显示了进一步的差异:basic_string 可能只针对文字类型。而basic_string 还接受第三个参数,即特征,它决定了如何进行比较。

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

    【讨论】:

    • 我觉得vector和basic_string都是用指针指向数据区,所以实现swap的唯一有效方式就是像vector一样把指向连续数据区的指针交换一下,不是吗?
    • @cong:重复一遍:字符串没有这样的要求。唯一的要求是数据连续存储。查看小缓冲区优化,它使用单独的数据区域,因此不能“交换”,而是需要复制数据。
    • 好的,我可以查一下来源。
    【解决方案2】:

    std::string不是std::vector。这是std::basic_string

    【讨论】:

    • 那么std::basic_string是如何实现的呢? std::basic_string 是容器吗?
    • 根据我的经验,它通常不被认为是一个容器,但它一个字符容器,所以我想你可以这样想。至于执行;你可以去看看 gcc 或 clang 的标准库源代码。
    • @cong:不,basic_string 不是容器。不要把它当成一个容器。它与容器共享一些属性,但在其他方面有所不同。
    【解决方案3】:

    std::string 在标题&lt;string&gt; 中定义为这样的模板:

    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&lt;char&gt; 是不一样的。

    它们的实现方式不同。

    【讨论】:

    • 能否以通俗易懂的方式告诉我 swap for basic_string 的实现?看stl源码对我来说有点困难。
    • 文档中有一个简单的例子:std::basic_string::swap
    • 这个例子我完全可以理解,我真正想知道的是为什么swap for string的实现和vector不一样,只是交换指向数据区的指针。
    猜你喜欢
    • 2012-03-07
    • 2011-10-26
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2021-03-23
    相关资源
    最近更新 更多