有没有办法创建N个元素的向量,而不需要调用复制构造函数,而是调用元素'默认构造函数?我不想要元素的复制构造函数,因为应该防止复制。
看起来你可以,选项3:
http://en.cppreference.com/w/cpp/container/vector/vector
3)使用count的count-inserted实例构造容器 T. 没有制作副本。
但在这看起来你不能:
http://www.cplusplus.com/reference/vector/vector/vector/
空容器构造函数(默认构造函数)构造一个没有元素的空容器。
fill constructor构造一个包含n个元素的容器。每个元素都是val的副本(如果提供)。
range constructor构造一个容器,其元素与范围[first,last]一样多,每个元素都由其构造 该范围内的相应元素,顺序相同。
复制构造函数(以及使用allocator复制)构造一个容器,其中包含x中每个元素的副本,顺序相同。
移动构造函数(并使用allocator移动)构造一个获取x元素的容器。如果指定了alloc并且 与x的分配器不同,元素被移动。否则,没有 构建元素(其所有权直接转移)。 X 保留未指定但有效的状态。
- 醇>
初始化列表构造函数构造一个容器,其中包含il中每个元素的副本,顺序相同。
答案 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);
}
标准本身很清楚,元素只需要是可默认构造的,不需要复制:
[C++11: 23.3.6.2]:
explicit vector(size_type n);
- 效果:使用
vector
值初始化元素构造n
。- 要求:
T
应为DefaultConstructible
。- 复杂性:
醇>n
中的线性。
答案 1 :(得分:4)
这取决于您使用的C ++版本。在C ++ 11之前,唯一的 将元素放入向量的方法是复制:
std::vector<T> v( 10 );
相当于:
std::vector<T> v( 10, T() );
将默认构造的T
复制10次。 C ++ 11改变了这一点,
并且第一个表单需要默认构造T
10次,
没有任何复制。