17370845950

c++23的std::ranges::to怎么用_c++范围库到容器的转换
std::ranges::to 可将范围转换为指定容器,支持自动类型推导,如 std::views::iota(1, 6) | std::ranges::to() 生成 vector{1,2,3,4,5},也可转为 list、deque、array 等,要求 array 大小匹配。

在 C++23 中,std::ranges::to 是一个便捷的工具函数,用于将任意范围(range)转换为指定的容器类型。它简化了从迭代器范围构造容器的过程,支持自动推导目标容器类型,也可显式指定。

基本用法:将范围转换为容器

std::ranges::to 可以接收一个范围(如数组、vector、views 等),并将其元素复制到新的容器中。最常见的是转为 std::vectorstd::liststd::array

示例:

auto vec = std::views::iota(1, 6) | std::ranges::to<:vector>>(); // 结果:vec 包含 {1, 2, 3, 4, 5}

这里使用了 std::views::iota 生成从 1 到 5 的整数序列,并通过 std::ranges::to 转为 vector。

自动类型推导(C++23 支持)

如果你不显式指定模板参数,std::ranges::to 可结合上下文自动推导目标容器类型。

例如:

std::vector numbers{1, 2, 3, 4, 5}; auto doubled = numbers | std::views::transform([](int x){ return x * 2; }) | std::ranges::to<:vector>(); // 自动推导为 vector

注意:省略 ,由输入范围元素类型自动确定。

转换为其他容器

除了 vector,你也可以转为 list、deque、set 等:

auto as_list = numbers | std::ranges::to<:list>>(); auto as_deque = std::views::take(numbers, 3) | std::ranges::to<:deque>();

支持任意满足容器要求的目标类型,只要其支持范围构造函数。

固定大小数组(std::array)

如果源范围大小已知且编译期可确定,可以转为 std::array

std::array arr = std::views::iota(0, 3) | std::ranges::to<:array>>(); // arr == {0, 1, 2}

注意:目标 std::array 的大小必须与实际元素个数匹配,否则编译错误。

基本上就这些。std::ranges::to 让范围转容器变得简洁直观,配合 views 使用非常自然。