在C ++ 11中,std :: vector具有构造函数vector(size_type n)
,它将默认构造n
项,这些项可以与默认的可构造,可移动,不可复制的类一起使用。 / p>
但是,与其他每个矢量构造函数不同,没有采用分配器的变体,我采用了以下方法:
// Foo is default constructible and moveable, but not copyable
const int n = 10; // Want 10 default constructed Foos
std::vector<Foo, CustomAllocator> foos(allocator);
foos.reserve(n);
for (int i = 0; i < n; ++i)
foos.emplace_back();
有没有更好的方法来实现这一目标?是否有特定原因vector(size_type n, const Allocator& alloc)
从标准中删除了?
答案 0 :(得分:7)
首先,您可以简单地使用reserve
来实现您想象的构造函数所能做的事情,而不是您的resize
/ loop thingy:
const int n = 10;
std::vector<Foo, Alloc> foos(allocator);
foo.resize(n);
另一种选择是使用size_type n
构造函数的三个参数版本:
const int n = 10;
std::vector<Foo, Alloc> foos(n, Foo(), allocator);
虽然这实际上是副本构建到元素中,这可能是也可能是不可接受的。
理由是什么?不知道。可能被忽视了。
答案 1 :(得分:7)
在考虑之后,它可能不是一个缺陷。
allocator_type
和value_type
可能是相同的类型。在这种情况下,vector(3, alloc)
会调用哪个函数?采用默认值进行复制初始化为所有元素的构造函数,或者采用大小和分配器的元素?这是不明确的,因而是编译错误。