C++如何从std::vector<std::tuple<int, float>>提取std::vector<int>用于构造初始化列表
实现方案
存在可直接用于构造函数初始化列表的单行实现,根据你使用的C++标准可选以下两种方案:
C++20 及更高版本
直接使用标准库范围工具实现,代码最简洁:
#include <vector> #include <tuple> #include <ranges> class Demo { const std::vector<int> target_vec; public: Demo(std::vector<std::tuple<int, float>> input) : target_vec(input | std::views::transform([](const auto& t) { return std::get<0>(t); }) | std::ranges::to<std::vector<int>>()) {} };
代码说明:std::views::transform 会遍历输入容器提取每个tuple的第一个元素,再通过std::ranges::to直接转换为std::vector<int>,整个表达式可以直接放在初始化列表中。
C11 ~ C17 兼容版本
如果使用旧标准,可以用立即调用的lambda表达式实现,不需要额外定义辅助函数:
#include <vector> #include <tuple> #include <algorithm> #include <iterator> class Demo { const std::vector<int> target_vec; public: Demo(std::vector<std::tuple<int, float>> input) : target_vec([&input]() { std::vector<int> res; res.reserve(input.size()); std::transform(input.cbegin(), input.cend(), std::back_inserter(res), [](const std::tuple<int, float>& t) { return std::get<0>(t); }); return res; }()) {} };
代码说明:lambda定义完成后直接加()执行,返回的vector直接用于const成员初始化,整个初始化逻辑是初始化列表中的单条语句,满足你的要求。
内容的提问来源于stack exchange,提问作者matthias_buehlmann
相关产品推荐
相关产品推荐

