gpt4 book ai didi

c++ - 从对象列表中提取特定成员的优雅方式

转载 作者:行者123 更新时间:2023-11-27 22:40:37 24 4
gpt4 key购买 nike

我有一个容器,其中包含一些任意结构/类的元素。有没有一种优雅的方法可以将单个属性(例如 member 或 member.function)提取到自己的数组中(例如将其传递给另一个算法)?

#include <iostream>
#include <string>
#include <vector>

int main()
{
struct A{
int n;
int B()const;
};

std::vector<A> manyOfA{{1,1}, {2,2},{3,3}};
std::vector<int> allNs;

// is there a standard way to do this kind of extraction?
for(const auto& a:manyOfA){
allNs.push_back(a.n);
// or maybe allNs.push_back(a.B());
};

std::cout << "result Vector: ";
for(const auto& n: allNs){
std::cout << n << ", ";
};
std::cout << std::endl;
}

最佳答案

您可以使用 std::transform将函数应用于迭代器范围的每个元素并将结果收集在结果范围中。在您的情况下,结果范围可以是 std::back_inserter 迭代器。这是一个特殊的迭代器,在给定容器上赋值时调用 v.push_back

std::vector<A>   manyOfA{{1,1}, {2,2},{3,3}};
std::vector<int> allNs;

std::transform(manyOfA.begin(), manyOfA.end(), std::back_inserter(allNs), [](A const& a) {return a.n;});

或者使用范围库更好,例如升压范围。这将保存一个新 vector 的创建,只是为了保存 a.n 的值:

template <typename RangeType>
void doSomethingWithRange(const RangeType &range) { ... }

auto allNs = manyOfA | transformed([](A const& a) {return a.n;});
doSomethingWithRange(allNs);

关于c++ - 从对象列表中提取特定成员的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49322101/

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