添加到矢量而不复制结构数据

时间:2012-05-07 20:03:14

标签: c++ vector

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

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

结构和元组(另一个结构)由体系结构预定义并在我的方法中提供给我;所以我无法改变它们。我想生成并将元组插入到原始空的tuple_list中。

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

所以我的问题是,有没有更快的方法来填充我的元组列表的内容而不分配和复制元组?如果这是一个数组,我可以使数组尽可能大,然后通过对tuple_list [0]的引用到创建元组的函数。这样,函数可以填充数组中已分配的元组的空内容,而无需分配新元组或从一个元组复制到另一个元组。当我的itterator指向0x0时,我试图用矢量出于好奇并最终得到一个seg错误,所以我认为语法对矢量不起作用。那么有一种快速的方法来完成这项任务吗?

因为这对于学习语言和实际使用都是一个问题,所以你可以自由地投入任何其他与你认为有趣的相关的东西,我希望学习。

感谢。

1 个答案:

答案 0 :(得分:19)

在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,同时也避免复制。