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

发布于 2024-12-02 05:48:36 字数 575 浏览 0 评论 0原文

我有一个对象向量。每个对象都有一个不可复制对象(boost::signal)的boost::shared_ptr。该对象的默认构造函数创建 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 对象。

有没有比在 for 循环中使用 push_back 更简单的方法来正确构建向量?

I have a vector of objects. Each object has a boost::shared_ptr to a noncopyable object (a boost::signal). the object's default constructor creates the boost::signal object.

struct FuncRef
{
    typedef boost::signal0<void, > Func;
    boost::shared_ptr <Func> function;
    FuncRef():
        function(new Func)
    {
    }
};

To set my vector to contain X individual objects, I did this:-

vec.resize(X);

This didn't do what I expected, because it uses the default constructor to make one object, and then the copy constructor to make the duplicates. I end up with X objects, but they all point to the same boost::signal0 object.

Is there an easier way of building my vector correctly than just using push_back in a for loop?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

陪我终i 2024-12-09 05:48:36

我能想到的唯一方法是使用 reserve 使向量分配您需要的内存(正如@Jonathan 回答的那样)。您可以将 generate_nstd::back_inserter 一起使用来添加元素:

FuncRef makeFuncRef() {
    return FuncRef();
}

vec.reserve(vec.size() + n);
std::generate(std::back_inserter(vec), n, makeFuncRef);

此方法不需要 reserve,尽管它可能是如果n很大,则速度更快。

The only way I can think of is to use reserve to make the vector allocate the memory you need (as @Jonathan answered). You can the use generate_n with an std::back_inserter to add the elements:

FuncRef makeFuncRef() {
    return FuncRef();
}

vec.reserve(vec.size() + n);
std::generate(std::back_inserter(vec), n, makeFuncRef);

The reserve is not necessary with this approach, although it is probably faster if n is large.

把回忆走一遍 2024-12-09 05:48:36

我能想到的最简单的方法是预先保留内存,以便向量只需要一次分配:

vec.reserve(X);

然后循环和push_back() 。这还不足以满足您的需求吗?

The simplest way I can think of is to reserve the memory beforehand so that only one allocation is needed by the vector:

vec.reserve(X);

Then loop and push_back(). Is that not sufficient for your needs?

北凤男飞 2024-12-09 05:48:36

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

Are you not able to implement a copy constructor/copy assignment with actual copy semantics? Unless you're having serious performance with the vector filling this seems like the most obvious solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文