假设我在 C++ 中有以下结构
struct Foo {
double a;
int b;
};
假设我有一个函数的参数声明如下:
const std::initializer_list<Foo> &args;
是否有一种简洁的方法可以从 args
中的元素中提取一个字段,例如,仅包含一个包含每个 b
字段的 std::vector原始 args
列表?
当然,我知道我可以通过明确地将其写成一个循环来做到这一点:
std::vector<int> result;
for(auto &x:args) {
result.push_back(x.b);
}
...但是鉴于我可以在一行 C++ 中将任何类型的整个 initializer_list 复制到类似类型的 vector ,只需使用 std::copy 和 std::back_inserter 之类的函数,我想知道是否有也是一种更优雅的方法,使用可能已经存在的 STL 或 C++11 工具。
最佳答案
您可以使用 std::transform
并通过 std::back_inserter
向 vector 添加元素:
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));
但话又说回来,您的方法不一定是坏的,因为它非常可读并且工作得很好(可能有一些性能问题)。
关于C++11,仅将一个字段复制到 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45902704/