C++ 从 std::vector<std::tuple<int, float>> 获取 std::vector<int>

标签 c++ stdvector stdtuple

我想初始化一个 const std::vector<int>给定 std::vector<std::tuple<int, float>> 的构造函数初始化列表中的成员变量构造函数参数。该 vector 应包含所有第一个元组项。

是否有单行代码可以提取 std::vector<int>包含来自 std::vector<std::tuple<int, float>> 的所有第一个元组条目?

最佳答案

使用 C++20 范围:

struct X
{
    const std::vector<int> v;

    template <std::ranges::range R>
        requires std::convertible_to<std::ranges::range_value_t<R>, int>
    X(R r)
        : v{r.begin(), r.end()}
    {}

    X(const std::vector<std::tuple<int, float>>& vt)
        : X{vt | std::ranges::views::elements<0>}
    {}
};

使用范围-v3:

struct X
{
    const std::vector<int> v;

    X(const std::vector<std::tuple<int, float>>& vt)
        : v{vt | ranges::views::transform([] (auto t) {
                    return std::get<0>(t); })
               | ranges::to<std::vector>()}
    {}
};

还有科学怪人的怪物:

#include <ranges>
#include <range/v3/range/conversion.hpp>

struct X
{
    const std::vector<int> v;

    X(const std::vector<std::tuple<int, float>>& vt)
        : v{vt | std::ranges::views::elements<0>
               | ranges::to<std::vector>()}
    {}
};

关于C++ 从 std::vector<std::tuple<int, float>> 获取 std::vector<int>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69816375/

相关文章:

c++ - 在元组的元组中找到一个元组

c++ - 使用 gcc 和 g++ 分别编译包含 C 和 C++ 文件的项目?

c++ - 是否有将范围移动到 vector 中的标准方法?

c++ - 将 std::tuple<T...> 转换为 T

c++ - 我可以在一行代码中将符合条件的 vector 的所有元素插入到集合中吗

c++ - std::vector 的容量如何自动增长?费率是多少?

c++ - 使用在每种类型的可变参数模板上模板化的类初始化元组

c++ - 在 libc++ 上,为什么 regex_match ("tournament", regex ("tour|to|tournament")) 失败?

c++ - 循环构造函数

C++ 在基础对象 std::swap 之后是否保证派生对象数据有效?