15

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

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

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

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

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

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

谢谢。

4

1 回答 1

34

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

于 2012-05-07T20:09:59.730 回答