[英]how to init data of class that exists in stl container?
例如,我有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使用新标准,添加的功能被授予Allocator类型的对象。
添加的功能之一是Allocators现在允许进驻建筑,也就是说。 使用除复制/移动之外的构造函数构造对象。
template< class U, class... Args > void construct( U* p, Args&&... args );
该标准确实保证了STL容器必须使用这个新功能,并且说明你可以实现自己的分配器,只是为了默认初始化一个非默认初始化对象。
这不是最漂亮的解决方案,但无论如何漂浮在你的船上......
C ++ 03分配器与对象初始化的那一部分无关,它的唯一目的是分配/释放内存,你所指的初始化类型是在别处完成的。
当有人要求它执行placement-new时 ,分配器将调用的唯一构造函数是copy-constructor ,并且传递给该copy-ctor的值已经在其他地方建立。
总结一下; 不,你不能使用分配器,所以解决这个特殊的问题。
std::vector
只使用它在两种情况下保存的类型的默认构造函数 :
您在相应的构造函数重载中指定std::vector
的元素数,但不提供默认值
你使用std::vector<T>::resize (n)
并增加容器中的对象数量(注意缺少为成员函数指定第二个参数)
考虑到上述情况,我们可以使用容器做很多事情而不在我们的对象中提供默认构造函数,比如初始化它以包含值为X的 N个元素。
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
}
然后你有
两个
,
三个
,四个选项:
使用C ++ 11方法使用Allocators
使您的对象具有默认构造函数
用一个非常薄的包装器包装你的对象,它的唯一目的是默认初始化包含的对象(在某些情况下这可能更容易说完)
“在boost :: optional中包装[对象]实际上给任何类型一个默认的ctor” - @ Xeo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.