创建大小元素的向量,而不调用复制构造函数?

时间:2015-01-30 12:10:03

标签: c++ vector

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

看起来你可以,选项3:

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

  

3)使用count的count-inserted实例构造容器   T. 没有制作副本

但在这看起来你不能:

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

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

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

  4.   
  5. range constructor构造一个容器,其元素与范围[first,last]一样多,每个元素都由其构造   该范围内的相应元素,顺序相同。

  6.   
  7. 复制构造函数(以及使用allocator复制)构造一个容器,其中包含x中每个元素的副本,顺序相同。

  8.   
  9. 移动构造函数(并使用allocator移动)构造一个获取x元素的容器。如果指定了alloc并且   与x的分配器不同,元素被移动。否则,没有   构建元素(其所有权直接转移)。 X   保留未指定但有效的状态。

  10.   
  11. 初始化列表构造函数构造一个容器,其中包含il中每个元素的副本,顺序相同。

  12.   

2 个答案:

答案 0 :(得分:5)

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

你误读了cplusplus.com的措辞。它说" fill构造函数构造一个包含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. 效果:使用vector值初始化元素构造n
  2.   
  3. 要求: T应为DefaultConstructible
  4.   
  5. 复杂性:n中的线性。
  6.   

答案 1 :(得分:4)

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

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

相当于:

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

将默认构造的T复制10次。 C ++ 11改变了这一点, 并且第一个表单需要默认构造T 10次, 没有任何复制。