为什么C++ 11中没有向量(size_type n,const Allocator&alloc)?

rkj*_*nsn 6 c++ vector allocator c++11

在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();
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这一目标?vector(size_type n, const Allocator& alloc)标准中是否省略了具体原因?

Xeo*_*Xeo 7

首先,reserve你可以简单地resize用来实现想象构造函数的功能,而不是你的/ loop thingy :

const int n = 10;
std::vector<Foo, Alloc> foos(allocator);
foo.resize(n);
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用size_type n构造函数的三个参数版本:

const int n = 10;
std::vector<Foo, Alloc> foos(n, Foo(), allocator);
Run Code Online (Sandbox Code Playgroud)

虽然这实际上构造复制到元素中,这可能是也可能是不可接受的.

在理由上?不知道.可能被忽视了.


Nic*_*las 7

在考虑之后,它可能不是一个缺陷.

有可能allocator_type并且value_type是相反类型.在那种情况下,哪个函数会vector(3, alloc)调用?采用默认值进行复制初始化为所有元素的构造函数,或者采用大小和分配器的构造函数?这是模棱两可的,因此编译错误.

  • 标准库通常必须避免在带有模板化参数的函数重载中使用相同数量的参数.例如,这就是为什么他们最终没有引入可变参数std :: max而是使用带有初始化列表的版本.可变版本不可能以易于使用的方式实现,同时仍允许自定义比较. (3认同)