说我在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工具也是一种更优雅的方法。
答案 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