6

在 C++11 中,std::vector 具有vector(size_type n)默认构造n项的构造函数,可以与默认构造的、可移动的、不可复制的类一起使用。

但是,与其他所有向量构造函数不同,没有采用分配器的变体,我采用了以下方法:

// 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)标准中省略了具体原因吗?

4

2 回答 2

7

首先,您可以简单地使用来代替您的reserve/loop 东西resize来实现您想象的构造函数会做的事情:

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);

尽管这实际上将构造复制到元素中,这可能是可接受的,也可能是不可接受的。

理由是什么?不知道。大概是被忽略了。

于 2012-02-23T22:34:11.447 回答
7

想来想去,也未必是瑕疵。

有可能是allocator_typevalue_type反常的同一类型。在那种情况下,会调用哪个函数vector(3, alloc)?采用默认值复制初始化到所有元素的构造函数,还是采用大小和分配器的构造函数?这是模棱两可的,因此是编译错误。

于 2012-02-23T22:41:12.523 回答