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

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

我有一个结构 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>&);

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

我认为更优的解决方案是更改 func2 以将 &std::vector<MyStruct> 作为参数 by reference 以便没有副本制成。然后你可以通过 myStruct[i].value1.

访问每个元素

你想要的是引用类型,而不仅仅是任何类型,而是引用的引用,这正是指针的用武之地

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

试试这个,请告诉我它应该可以解决您的问题

给你:

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

emplace_back 直接从参数 elem.value1 构造元素,这与 push_back 不同,后者是从相同参数创建的副本构造元素,即 elem.value1.

如果 MyStruct 仅由两个 int 值组成,您可以将其替换为 std::pair 这是一个具有两个 public 成员的结构,即 first 和 be second。您的 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);