如何使用唯一对象调整std :: vector的大小

时间:2011-08-30 11:49:39

标签: c++ resize stdvector

我有一个对象矢量。每个对象都有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更简单的方法来正确构建向量?

3 个答案:

答案 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)

您是否无法使用实际的复制语义实现复制构造函数/复制赋值?除非你在矢量填充方面有很好的表现,否则这似乎是最明显的解决方案。