gpt4 book ai didi

c++ - 添加到 vector 而不复制结构数据

转载 作者:可可西里 更新时间:2023-11-01 17:09:12 29 4
gpt4 key购买 nike

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

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

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

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

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

由于这是一个既要学习语言又要实际使用的问题,请随意添加您认为有趣的任何其他切线相关的东西,我期待学习。

谢谢。

最佳答案

在 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 存储在 vector 中之后使用对它的引用:

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();

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

关于c++ - 添加到 vector 而不复制结构数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10488348/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com