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

use*_*112 1 c++ vector

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

这看起来像你可以,选项3:

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

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

但在这看起来你不能:

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

  1. empty container constructor(default constructor)构造一个没有元素的空容器.

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

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

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

  5. 移动构造函数(并使用allocator移动)构造一个获取x元素的容器.如果指定了alloc并且与x的allocator不同,则移动元素.否则,不构建任何元素(它们的所有权直接转移).x保持未指定但有效的状态.

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

Lig*_*ica 5

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

你误读了cplusplus.com的措辞.它说"fill constructor构造一个包含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);
}
Run Code Online (Sandbox Code Playgroud)

(现场演示)

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

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

  1. 效果:vector使用n值初始化元素构造a .
  2. 要求:T应该是DefaultConstructible.
  3. 复杂性:线性输入n.