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::vector、std::list 或 std::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++免费学习笔记(深入)”;
自动类型推导(C++23 支持)
如果你不显式指定模板参数,std::ranges::to 可结合上下文自动推导目标容器类型。
例如:
std::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 使用非常自然。











