【问题标题】:add to vector without copying struct data添加到向量而不复制结构数据
【发布时间】:2012-05-07 20:03:14
【问题描述】:

这可能是一个简单的 C++ 问题,但我正在重新学习 C++,并且不知道一些基础知识。我有一个类,其中包含一个带有对象向量的结构,所以是这样的:

struct my_struct{
    Irrelevant_Object object,
    vector<tuple> tuple_list;
}

结构和元组(另一个结构)由架构预定义并在我的方法中提供给我;所以我不能改变它们。我想生成一个元组并将其插入到原来的空元组列表中。

简单的解决方案是分配一个新的元组对象,填充元组数据,然后调用 tuple_list.push_back() 并传入分配的元组。但这需要分配一个新的元组,只是为了让 push_back 方法将(大)元组结构的所有内容复制到向量的已经定义的内存空间中。因此,我支付了分配/删除的费用,以及将元组内容复制到向量中的较少费用来做到这一点。这似乎相当低效,而且由于这种方法将处于函数的关键路径中,我更喜欢更快的方法(诚然,我怀疑这种方法会成为瓶颈,而且我知道早期优化 == 不好。但是,我更多地询问这个问题以了解有关 C++ 语法的知识,然后出于迫切需要在我的代码中实际执行此操作)。

所以我的问题是,有没有更快的方法来填充我的元组列表的内容而不分配和复制元组?如果这是一个数组,我可以使数组尽可能大,然后将对 tuple_list[0] 的引用传递给创建元组的函数。这样,函数可以填充数组中已分配元组的空内容,而无需分配新元组或从一个元组复制到另一个元组。出于好奇,我尝试对向量进行此操作,并在我的迭代器指向 0x0 时出现段错误,因此我假设该语法不适用于向量。那么有没有快速完成这项任务的方法?

由于这是一个学习语言和实际使用一样多的问题,请随意添加您认为有趣的任何其他相关的东西,我正在学习。

谢谢。

【问题讨论】:

  • 查看std::vector 的重载构造函数并为您的结构提供构造函数和初始化列表?否则,您始终可以将您的向量 reserve 分配到您需要的空间,以便 push_back 调用使用可用空间并且没有那么高的分配成本。需要更具体的示例和用例来提供真正的答案。

标签: c++ vector


【解决方案1】:

在C++11中,你可以使用std::vector::emplace_back,它就地构造新对象,因此使用该方法时不会复制。

通过使用这种方法,你可以做到这一点:

my_struct some_struct;
some_struct.tuple_list.emplace_back(1, 5, "bleh");

假设您的 tuple 对象包含此构造函数:

tuple::tuple(int, int, const std::string&)

编辑:您也可以使用move semantics 来存储预先分配的元组:

my_struct some_struct;
tuple a_tuple;
/* modify a_tuple, initialize it, whatever... */
some_struct.push_back(std::move(a_tuple)); // move it into your vector

或者在将tuple 存储在向量中后使用它的引用:

my_struct some_struct;
some_struct.tuple_list.emplace_back(1, 5, "bleh");
// store a reference to the last element(the one we've just inserted)
tuple &some_tuple = some_struct.tuple_list.back(); 
some_tuple.foo();

在上述所有解决方案中,您只创建了一个tuple,同时还要避免复制。

【讨论】:

  • 这几乎正是我想要的(假设我们安装了 c++11,我会仔细检查)。但是,由于元组很大,我更愿意将向量元组的引用(或为元组分配的空间)传递给方法,并一次在变量一个元素上构建内容。是否有类似的方法可以返回对我可以使用的预分配元组的引用?
  • 只是为了澄清我可以通过这两种方法得到我想要的东西。没有任何内容的 emplace_back 调用声明了一个空元组结构,然后我使用 vector.back() 获取空结构并将其传递给我的方法以填充真实数据。其他选项似乎没有分配和释放元组。可悲的是我毕竟不能使用 c++11,但知道未来是件好事
猜你喜欢
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2011-07-03
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多