std::ranges::sort 和 std::sort 有和区别
std::ranges::sort 和 std::sort 的主要区别在于它们属于不同的 C++ 标准库设计范式:
1. 设计理念差异
std::sort (C++98 起):
- 基于迭代器的传统 STL 设计
- 需要传递开始和结束迭代器
std::ranges::sort (C++20 起):
- 基于 ranges 的现代设计
- 可以直接操作整个容器或 range
2. 语法对比
#include <vector>
#include <algorithm>
#include <ranges>
std::vector<int> vec = {3, 1, 4, 1, 5, 9};
// 传统方式
std::sort(vec.begin(), vec.end());
// ranges方式
std::ranges::sort(vec);3. 功能特性
std::ranges::sort 的优势:
- 更简洁:可以直接传入容器,无需显式指定迭代器
- 投影支持:内置 projection 参数,可以指定排序依据
- 概念约束:使用 concepts 进行更好的类型检查
- 可组合性:与其他 ranges 算法更好地配合使用
// 投影示例
struct Person { std::string name; int age; };
std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}};
// ranges版本可以直接指定排序字段
std::ranges::sort(people, {}, &Person::age);
// 传统版本需要lambda
std::sort(people.begin(), people.end(),
[](const Person& a, const Person& b) { return a.age < b.age; });4. 参数形式
// std::sort
template<class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);
// std::ranges::sort
template<std::random_access_iterator I, std::sentinel_for<I> S,
class Comp = ranges::less, class Proj = std::identity>
constexpr I sort(I first, S last, Comp comp = {}, Proj proj = {});两者在性能上基本相同,主要区别在于 API 设计的现代化程度和易用性。如果你的项目使用 C++20 或更新版本,推荐使用 std::ranges::sort 以获得更好的代码可读性和类型安全性。