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

标签 c++

我有一个容器,其中包含一些任意结构/类的元素。 有没有一种优雅的方法可以将单个属性(例如 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/

相关文章:

c++ - 两种链接 boost 正则表达式的方法出错

c++ - 从 lambda 中的容器中删除 self

C++比较2个字符串

C++ 编译器或链接器优化

c++ - Qt Widget 中的默认初始化列表

c++ - 有没有办法从整数获取模板类型?

c++ - 如何启动多个线程并且每个线程处理不同的文件?

c++ - 我可以在 nlopt 中表示染色体吗?

c++ - libtool link - 便利库的全局状态初始化

c++ - 数组索引错误