如何快速从 std::vector 中拾取元素<struct>?

How to pick up elements from std::vector<struct> quickly?

本文关键字:lt struct gt 元素 何快速 std vector      更新时间:2024-09-24

我有一个结构MyStruct,它有一些元素(包括int value1(和一个std::vector<MyStruct>。我如何从每个MyStruct中提取所有的value1,并拥有一个std::vector<int>,它是value1的向量。不会对新矢量进行写入操作。

以下内容是可能的,但需要副本。有什么解决方案可以避免它吗?

struct MyStruct{
int value1;
int value2
};
std::vector<MyStruct> myStruct = func1();
std::vector<int> ans;
for (auto i:myStruct)
{
ans.push_back(i.value1);
}
func2(ans);  //func2 (const vector<int>&);

结构结构只是一个例子。我使用的实际结构要复杂得多。

这里是:

auto ret = func1();
std::vector<int> ans;
ans.reserve(ret.size());
for (auto const& elem : ret) {
ans.emplace_back(elem.value1);
}

template_back直接从参数elem.value1构造元素,而push_back则从从同一个参数(即elem_value1(创建的副本构造元素。

如果MyStruct仅由两个int值组成,则可以将其替换为std::pair<int,int>它是一个具有两个公共成员的结构,即第一个和第二个。您的value1将是第一位,value2将是第二位。你可以这样做:

#include <utility>
#include <vector>
using MyStruct = std::pair<int, int>;
std::vector<MyStruct> func1(/*params...*/) {
std::vector<MyStruct> ret;
// grow ret
return ret;
}

然后在main((中替换

ans.emplace_back(elem.value1);

带有

ans.emplace_back(elem.first);

我认为一个更优化的解决方案是更改func2,通过引用将&std::vector<MyStruct>作为参数,这样就不会进行复制。然后您可以通过myStruct[i].value1访问每个元素。

您想要的是引用类型,而不仅仅是任何类型,而是引用的引用,这正是指针进入图片的地方

std::vector<int*> ans;
for (int i = 0; i < myStruct.size(); i++ )
{
ans.push_back(&myStruct.at(i).value1);
}

试试这个,请让我知道它应该可以解决你的问题