【问题标题】:Create vector of size elements, without calling copy constructor?创建大小元素的向量,而不调用复制构造函数?
【发布时间】:2015-03-29 21:55:31
【问题描述】:

有没有办法创建一个包含 N 个元素的向量而不调用复制构造函数,而是调用元素的默认构造函数?我不想要元素的复制构造函数,因为应该防止复制。

这里看起来可以,选项 3:

http://en.cppreference.com/w/cpp/container/vector/vector

3) 使用 count 默认插入的实例构造容器 T. 不制作副本

但在这里看起来你不能:

http://www.cplusplus.com/reference/vector/vector/vector/

  1. 空容器构造函数(默认构造函数)构造一个没有元素的空容器。

  2. fill 构造函数构造一个包含 n 个元素的容器。每个元素都是 val 的副本(如果提供)。

  3. 范围构造函数构造一个包含与范围 [first,last) 一样多的元素的容器,每个元素都从其 该范围内的对应元素,顺序相同。

  4. 复制构造函数(并使用分配器进行复制)构造一个容器,其中包含 x 中每个元素的副本,顺序相同。

  5. 移动构造函数(并使用分配器移动)构造一个获取 x 元素的容器。如果指定了 alloc 并且 与 x 的分配器不同,元素被移动。否则,不 元素被构造(它们的所有权直接转移)。 X 处于未指定但有效的状态。

  6. initializer list constructor 构造一个容器,其中包含 il 中每个元素的副本,顺序相同。

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    是的,这就是矢量的工作原理。

    您误读了 cplusplus.com 的措辞。它说“填充构造函数构造一个包含n个元素的容器。每个元素都是val(如果提供)的副本”;你无法摆脱它。但是你提供val

    我们可以用下面的简单代码简单地证明,当元素是默认构造时,不会(或至少不需要)复制:

    #include <vector>
    #include <iostream>
    
    struct T
    {
        T() { std::cout << "def-cons\n"; }
        ~T() { std::cout << "dest\n"; }
        T(const T&) = delete;
    };
    
    int main()
    {
        std::vector<T> v(5);
    }
    

    (live demo)

    标准本身很清楚,元素只需要默认构造,不需要可复制性:

    [C++11: 23.3.6.2]:explicit vector(size_type n);

    1. 效果:构造一个带有n值初始化元素的vector
    2. 要求:T 应为 DefaultConstructible
    3. 复杂性:n 中的线性。

    【讨论】:

      【解决方案2】:

      这取决于您使用的 C++ 版本。在 C++11 之前,唯一 将元素放入向量的方法是通过复制:

      std::vector<T> v( 10 );
      

      相当于:

      std::vector<T> v( 10, T() );
      

      使用默认构造的 T 复制 10 次。 C++11 改变了这一点, 而第一种形式需要默认构造T 10次, 没有任何复制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-29
        • 2015-01-24
        • 2017-09-26
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 2012-02-28
        相关资源
        最近更新 更多