创建大小元素的向量,而无需调用复制构造函数
Create vector of size elements, without calling copy constructor?
有没有办法在不调用复制构造函数的情况下创建 N 个元素的向量,而是调用元素的默认构造函数?我不想要元素的复制构造函数,因为应该防止复制。
在这里看起来你可以,选项 3:
http://en.cppreference.com/w/cpp/container/vector/vector
3) 使用计数默认插入的实例构造容器 T. 不制作副本。
但在这里看起来你不能:
http://www.cplusplus.com/reference/vector/vector/vector/
空容器构造函数(默认构造函数) 构造一个没有元素的空容器。
- 范围构造
fill 构造函数 构造包含 n 个元素的容器。每个元素都是 val 的副本(如果提供)。
函数 构造一个容器,其中包含与范围 [first、last] 一样多的元素,每个元素都由其构造 该范围内的相应元素,顺序相同。
- 顺序相同。
复制构造函数(以及使用分配器复制) 构造一个容器,其中包含 x 中每个元素的副本,
move 构造函数(并使用分配器移动) 构造一个获取 x 元素的容器。如果指定了分配并且 与 X 的分配器不同,元素是移动的。否则,没有 元素被构造(它们的所有权直接转移)。x 保持未指定但有效的状态。
初始值设定项列表构造函数 按相同的顺序构造一个容器,其中包含 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);
- 效果:使用
n
值初始化元素构造vector
。- 要求:
T
应DefaultConstructible
。- 复杂度:
n
线性。
您使用C++的版本。 在C++11之前,唯一的将元素放入向量的方法是通过复制:
std::vector<T> v( 10 );
相当于:
std::vector<T> v( 10, T() );
使用默认构造T
复制 10 次。 C++11 改变了这一点,并且第一种形式需要默认构造T
10 次,没有任何复制。
- 当从函数参数中的临时值调用复制构造函数时
- 为什么调用复制构造函数而不是移动构造函数?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 编译器调用复制运算符而不是移动运算符
- push_back std::vector,则重复调用复制构造函数
- 为什么调用复制构造函数来构造空unique_ptr向量?
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 我打算调用initializer_list构造函数,如果存在,则事先调用复制构造函数:为什么?
- C++ - 从移动分配运算符调用复制分配
- 构造函数初始值设定项列表未调用复制构造函数
- 为什么在我的代码中调用复制构造函数而不是移动构造函数?
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 通过引用传递对象时是否调用复制构造函数?
- 如果函数按值传递并按值返回,将调用复制构造函数多少次
- 为什么要抛出引用调用复制构造函数的异常?
- 为什么即使参数标记为"const",也会调用复制构造函数?
- Clang-Tidy:移动构造函数通过调用复制构造函数来初始化类成员
- 为什么当我添加一个不同的对象(复制构造函数中的参数)时调用复制构造函数?
- 为什么调用复制构造函数,当我只返回对象 c++ 的引用时
- 为什么在下面的代码中调用复制构造函数两次