C++11,仅将一个字段复制到 vector 中

标签 c++ c++11 vector stl

假设我在 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/

相关文章:

C++ std::unordered_map

C++ 将指针传递给多维数组

c++ - decltype 和括号

c++ - 如何在Qt中用宏定义信号

c++ - C++如何在二维 vector 初始化中创建不同的 vector ?

c++ - 如何在 C++ 中创建自定义的 logic_error 派生类?

堆的 C++ 损坏

c++ - STL codecvt 错误 c++

c++ - 在 vector/矩阵中组合变量

c++ - 填充 vector 的 vector 时出错:没有可调用 std::basic_string::push_back 的匹配函数