有没有办法在不调用复制构造函数的情况下创建N个元素的向量,而是调用元素的默认构造函数?我不想要元素的复制构造函数,因为应该防止复制.
这看起来像你可以,选项3:
http://en.cppreference.com/w/cpp/container/vector/vector
3)使用计数默认插入的T实例构造容器.不制作副本.
但在这看起来你不能:
http://www.cplusplus.com/reference/vector/vector/vector/
empty container constructor(default constructor)构造一个没有元素的空容器.
fill constructor构造一个包含n个元素的容器.每个元素都是val的副本(如果提供).
range构造函数构造一个容器,其元素与范围[first,last]一样多,每个元素都以相同的顺序从该范围内的相应元素构造.
复制构造函数(以及使用allocator复制)构造一个容器,其中包含x中每个元素的副本,顺序相同.
移动构造函数(并使用allocator移动)构造一个获取x元素的容器.如果指定了alloc并且与x的allocator不同,则移动元素.否则,不构建任何元素(它们的所有权直接转移).x保持未指定但有效的状态.
初始化列表构造函数构造一个容器,其中包含il中每个元素的副本,顺序相同.
是的,这就是矢量的工作原理.
你误读了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);
- 效果:
vector使用n值初始化元素构造a .- 要求:
T应该是DefaultConstructible.- 复杂性:线性输入
n.
| 归档时间: |
|
| 查看次数: |
805 次 |
| 最近记录: |