【问题标题】:Why elements in a vector need to be copy constructable? [duplicate]为什么向量中的元素需要是可复制构造的? [复制]
【发布时间】:2016-02-15 20:30:26
【问题描述】:

我有这个问题是因为我正在阅读auto_ptr 的部分。它说auto_ptr 不能保存在向量中,因为它具有破坏性的复制和分配。我能以某种方式理解它,我能想到的一个例子是 auto_ptr ap = vec[0] 之类的东西会让我感到惊讶。但是如果我谨慎使用它而不这样做,我可以将auto_ptr 存储在向量中吗?我不能存储有什么更深层次的原因吗?也许vector的内部实现需要元素需要可复制构造的假设?

谢谢。

【问题讨论】:

  • auto_ptr 已被弃用并且很难正确使用。尝试切换到unique_ptr,它会让你的事情变得更容易。

标签: c++ vector auto-ptr


【解决方案1】:

当一个向量被调整大小时,它的元素被复制到一个新的后备数组中,这就是使用复制构造函数的地方。如果您有足够新的编译器,请考虑改用 std::unique_ptr。

【讨论】:

    【解决方案2】:

    因为 vector 必须在其存储空间中存储一个已经构建的对象。因此,它必须将对象复制到自己的存储中。

    也是向量以确保scope-safety,它必须复制/移动传递的对象。

    查看 push_back 的文档

    std::vector::push_back
    void push_back( const T& value );   (1)
    void push_back( T&& value );    (2)     (since C++11)
    

    将给定的元素值附加到容器的末尾。

    1) 新元素被初始化为 value 的副本。

    2) 值被移动到新元素中。

    参数

    value - 要附加的元素的值

    类型要求

    • T 必须满足CopyInsertable 的要求才能使用重载

    • T 必须满足MoveInsertable 的要求才能使用重载

    CopyInsertable id 定义为

    指定可以在未初始化的存储中就地复制构造该类型的实例。

    【讨论】:

      猜你喜欢
      • 2017-03-26
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2012-09-15
      • 2022-08-11
      • 1970-01-01
      相关资源
      最近更新 更多