C++20 的 ranges 库让算法操作更直观、更安全、更组合化——不用再传迭代器对,直接对容器或视图操作,链式调用清晰自然。
传统写法需手动传递 begin() 和 end(),容易出错且冗长:
ranges 版本直接作用于范围,语义明确、无迭代器失效风险:
std::ranges::reverse(更常用的是配合视图(views)链式表达:
aut
o result = vviews 是轻量、惰性求值的只读适配器,不拷贝数据,支持管道操作(|):
std::views::filter:筛选满足谓词的元素std::views::transform:对每个元素做映射std::views::take/drop:取前 N 个或跳过前 N 个std::views::join:展平嵌套范围(如 vector> )actions 是就地修改原范围的操作(需左值),用法类似 views 但会改变数据:
std::ranges::sort(v) → 直接排序整个容器v | std::views::filter(pred) | std::actions::sort → 先过滤再就地排序子序列(C++23 扩展,部分编译器已支持)algorithms(如 std::ranges::find、std::ranges::count_if)接受单个范围参数,返回 iterator 或 bool 等,比传统算法更简洁安全。
std::ranges::to() 提取结果:auto evens = v | std::views::filter([](int x){return x%2==0;}) | std::ranges::to<:vector>();
std::ranges::view_interface,并实现 begin()/end()
启用 C++20 并确认标准库支持(GCC 10.2+、Clang 13+、MSVC 19.30+):
g++ -std=c++20 -O2 your_file.cpp头文件只需 (无需额外包含 或 ,但部分 view 可能需 等容器头)。
不复杂但容易忽略:ranges 是值语义 + 惰性计算的组合范式,习惯后代码更短、意图更清、错误更少。