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

Create vector of size elements, without calling copy constructor?

本文关键字:调用 复制 构造函数 元素 向量 创建      更新时间:2023-10-16

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

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

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

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

但在这里看起来你不能:

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

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

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

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

  5. 复制构造函数(以及使用分配器复制) 构造一个容器,其中包含 x 中每个元素的副本,

  6. 顺序相同。
  7. move 构造函数(并使用分配器移动) 构造一个获取 x 元素的容器。如果指定了分配并且 与 X 的分配器不同,元素是移动的。否则,没有 元素被构造(它们的所有权直接转移)。x 保持未指定但有效的状态。

  8. 初始值设定项列表构造函数 按相同的顺序构造一个容器,其中包含 il 中每个元素的副本。

是的,这就是矢量的工作方式。

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

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

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

(现场演示)

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

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

  1. 效果:使用n值初始化元素构造vector
  2. 要求: TDefaultConstructible
  3. 复杂度:n线性。
这取决于

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

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

相当于:

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

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