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

add to vector without copying struct data

本文关键字:复制 结构 数据 添加      更新时间:2023-10-16

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

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

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

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

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

由于这是一个学习语言和实际使用的问题,因此请随意加入您认为有趣的任何其他切线相关的东西,因此我希望学习。

谢谢。

在 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&)

编辑:您还可以使用移动语义来存储预分配的元组:

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