假设我在 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);
}
...但鉴于我可以在一行 C++ 中将任何类型的整个 initializer_list 复制到类似类型的向量,只需使用 std::copy 和 std::back_inserter 之类的函数,我想知道是否还有更多使用可能已经存在的 stl 或 C++11 工具也可以优雅地做到这一点。
您可以通过以下方式使用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));
但话又说回来,你的方法不一定是坏的,因为它非常易读并且可以很好地完成工作(可能有一些性能问题)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句