例如,我有A类:
class A{
int value_;
public:
A(A& a){
value_ = a.value_;
}
A(int value){
value_ = value;
}
};
我想要一个A类的向量,但我想将所有的值传递给
A(int value)
。 std::vector<A,allocator<A>> my_vector;
最好的方法是什么?
有没有使用分配器的方法?
最佳答案
c++11
随着新标准的增加,功能被分配给了分配器类型的对象。
添加的功能之一是,分配器现在也可以进行安置构造。使用复制/移动以外的构造函数构造对象。
template< class U, class... Args > void construct( U* p, Args&&... args );
该标准确实保证STL容器必须使用此新功能,并且可以说,您可以实现自己的分配器,仅用于默认初始化非默认可初始化对象的目的。
这不是最漂亮的解决方案,但是什么都可以使您的船漂浮起来。
c++03
分配器与对象初始化的那部分无关,它的唯一目的是分配/取消分配内存,您所指的初始化类型在其他地方完成。
当有人要求分配器执行新的放置,并且传递给该copy-ctor的值已经在其他地方建立时,分配器将调用的唯一构造器是copy-constructor。
总结:不,您不能使用分配器,因此可以解决此特定问题。
什么时候std :: vector需要使用default-ctor?
std::vector
在两种情况下仅使用其拥有的默认构造函数:您可以在适当的构造函数重载中指定
std::vector
的元素数量,但不提供默认值您使用
std::vector<T>::resize (n)
并增加容器中的对象数(请注意,没有为成员函数指定第二个参数)考虑到以上几点,我们可以使用容器做很多事情,而无需在对象中提供默认构造函数,例如将其初始化为包含N个值X的元素。
struct A{
A (A const& a)
: value_ (a.value_)
{ }
A (int value)
: value_ (value)
{}
int value_;
};
int
main (int argc, char *argv[])
{
std::vector<A> vec (5, A(1)); // initialize vector with 5 elements of A(1)
vec.push_back (A(3)); // add another element
}
但是我真的很想能够使用vec.resize()!?
然后,您有两个,三个,四个选项:
使用使用分配器的C ++ 11方法
使您的对象具有默认构造函数
用非常薄的包装器包装您的对象,该包装器的唯一用途是默认初始化包含的对象(说起来容易,然后在某些情况下可以做到)
“在boost :: optional中包装[对象]实际上为任何类型提供了默认的ctor”-@ Xeo
关于c++ - 如何初始化存在于STL容器中的类的数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11502601/