如何快速从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);
我有一个结构 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
#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);