我有一个对象矢量。每个对象都有boost::shared_ptr
到不可复制的对象(boost::signal
)。对象的默认构造函数创建boost :: signal对象。
struct FuncRef
{
typedef boost::signal0<void, > Func;
boost::shared_ptr <Func> function;
FuncRef():
function(new Func)
{
}
};
要将我的矢量设置为包含X个别对象,我这样做了: -
vec.resize(X);
这没有达到我的预期,因为它使用默认构造函数来创建一个对象,然后使用复制构造函数来创建重复项。我最终得到了X对象,但它们都指向同一个boost::signal0
对象。
有没有比在push_back
循环中使用for
更简单的方法来正确构建向量?
答案 0 :(得分:3)
我能想到的唯一方法是使用reserve
使向量分配你需要的内存(如@Jonathan的回答)。您可以generate_n
使用std::back_inserter
添加元素:
FuncRef makeFuncRef() {
return FuncRef();
}
vec.reserve(vec.size() + n);
std::generate(std::back_inserter(vec), n, makeFuncRef);
此方法不需要reserve
,但如果n
很大,则可能会更快。
答案 1 :(得分:1)
我能想到的最简单的方法是预先保留内存,以便vector
只需要一次分配:
vec.reserve(X);
然后循环并push_back()
。这不足以满足您的需求吗?
答案 2 :(得分:0)
您是否无法使用实际的复制语义实现复制构造函数/复制赋值?除非你在矢量填充方面有很好的表现,否则这似乎是最明显的解决方案。