C++ 为什么C+中没有向量(大小类型n,常量分配器&;alloc)+;11?

C++ 为什么C+中没有向量(大小类型n,常量分配器&;alloc)+;11?,c++,vector,c++11,allocator,C++,Vector,C++11,Allocator,在C++11中,std::vector具有构造函数vector(size\u type n),它将在适当的位置默认构造n项,可以与默认的可构造、可移动、不可复制类一起使用 但是,与其他所有向量构造函数不同,没有采用分配器的变体,我采用了以下方法: // Foo is default constructible and moveable, but not copyable const int n = 10; // Want 10 default constructed Foos std::vect

在C++11中,std::vector具有构造函数
vector(size\u 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();
//Foo是默认的可构造和可移动的,但不可复制
常数int n=10;//想要10个默认构造的foo吗
std::向量foos(分配器);
食品储备(n);
对于(int i=0;i

有没有更好的方法来实现这一点?标准中省略了
向量(size\u type n,const Allocator&alloc)
有什么具体原因吗?

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

const int n = 10;
std::vector<Foo, Alloc> foos(allocator);
foo.resize(n);
虽然这实际上是将构件复制到元素中,但这可能是可以接受的,也可能是不可以接受的


关于理由?不知道。可能被忽略了。

仔细考虑后,它可能毕竟不是一个缺陷


allocator\u type
value\u type
可能是完全相同的类型。在这种情况下,
vector(3,alloc)
调用哪个函数?采用默认值将initialize复制到所有元素的构造函数,还是采用大小和分配器的构造函数?这是不明确的,因此是编译错误。

听起来像是规范中的缺陷。如果还没有,就提交一份报告。@NicolBolas是否有描述提交报告过程的文档?没关系。查看我的帖子。报告缺陷:Yikes!我不认为我会想到这一点。很容易解决,这已经在其他地方使用(例如,
std::tuple
)。然后,分配器版本将是
vector(3,std::allocator_arg,alloc)
。标准库通常必须避免在带有模板参数的函数重载中使用相同数量的参数。例如,这就是为什么他们最终没有引入可变的std::max,而是使用了一个采用初始值设定项列表的版本。可变版本不可能以易于使用的方式实现,同时还允许自定义比较。@bames53:非常好。我半是在想象,没有超负荷是有原因的。而且,我从来不知道
max
可以接受自定义谓词@bames53:不幸的是,这也是委员会似乎有点不愿意采用范围的部分原因带谓词的范围重载将干扰不带谓词的迭代器重载。还有为什么会出现
std::copy
std::copy_(如果
),而不是另一个重载。谢谢。我知道我一定忽略了一个更简单的方法。
const int n = 10;
std::vector<Foo, Alloc> foos(n, Foo(), allocator);