C ++ 11,只将一个字段复制到一个向量中

时间:2017-08-27 07:37:34

标签: c++ c++11 vector stl

说我在C ++中有以下结构

struct Foo {
   double a;
   int b;
};

并说我有一个参数声明如下:

const std::initializer_list<Foo> &args;

是否有一种简洁的方法从args中的元素中仅提取一个字段,以获得仅包含原始b中每个args字段的std :: vector列出?

当然,我知道我可以通过明确地将其作为循环写出来来做到这一点:

std::vector<int> result;
for(auto &x:args) {
    result.push_back(x.b);
}

...但考虑到我可以将任何类型的整个initializer_list复制到C ++的单行中的类似类型的向量,只需使用std :: copy和std :: back_inserter等函数,我想知道是否存在使用可能已存在的stl或C ++ 11工具也是一种更优雅的方法。

2 个答案:

答案 0 :(得分:3)

您可以使用std::transform并通过std::back_inserter

向元素添加元素
std::transform(std::begin(args), std::end(args), std::back_inserter(result), 
[] (const Foo & foo) { return foo.b; });

如果您发现lambda太详细,则可以使用std::mem_fn代替(信用转到@StoryTeller)。

std::transform(std::begin(args), std::end(args), std::back_inserter(result), std::mem_fn(&Foo::b));

但话说回来,你的方法并不是必要的,因为它很可读并且工作得很好(可能会有一些性能问题)。

答案 1 :(得分:0)

一种解决方案可以使用linq++,如下所示:

set_accepted_list_frozen