1. 理解std::ranges排序选择的本质
第一次看到std::ranges的排序功能时,我下意识以为这只是旧版std::sort的简单封装。直到在重构一个数据处理系统时,我才真正体会到这个C++20新特性的威力——它不仅仅是语法糖,而是从根本上改变了我们处理序列操作的方式。
传统C++排序代码通常长这样:
cpp复制std::vector<int> data = {...};
std::sort(data.begin(), data.end());
而使用ranges后:
cpp复制std::vector<int> data = {...};
std::ranges::sort(data);
表面看只是省去了.begin()/.end()调用,但实际差异远不止于此。ranges带来的核心改变在于:
- 统一的接口风格:所有算法都接受range对象而非迭代器对
- 内置管道操作支持:可组合多个操作形成处理流水线
- 更安全的约束检查:编译时验证range是否满足算法要求
2. 基础排序场景对比
2.1 简单升序排序
最基础的用法就是对整个容器排序:
cpp复制std::vector<int> nums{3,1,4,1,5,9,2,6};
std::ranges::sort(nums);
// nums变为{1,1,2,3,4,5,6,9}
相比传统方式,省去了迭代器参数,代码更简洁。但要注意这仅适用于标准容器,原始数组仍需指定范围:
cpp复制int arr[] = {3,1,4};
std::ranges::sort(arr); // 错误!
std::ranges::sort(std::span{arr}); // 正确
2.2 自定义比较函数
传入比较函数的方式也有所变化:
cpp复制// 传统方式
std::sort(data.begin(), data.end(),
[](auto a, auto b){ return a > b; });
// ranges方式
std::ranges::sort(data, std::greater{});
ranges版本可以直接使用标准函数对象,也可以传递lambda:
cpp复制s
