std::sort
和std::ranges::sort
为例,std::ranges::sort
中的迭代器类受到std::random_access_iterator
概念的约束:
template< std::random_access_iterator I, std::sentinel_for<I> S,
class Comp = ranges::less, class Proj = std::identity >
requires std::sortable<I, Comp, Proj>
constexpr I
sort( I first, S last, Comp comp = {}, Proj proj = {} );
但是
std::sort
不是:
template< class RandomIt >
void sort( RandomIt first, RandomIt last );
为什么
std::sort
(以及所有非范围算法)不受约束?
当然有现实和历史原因;但如果有人想考虑事后原因:
你会破坏很多代码,范围风格的要求比你想象的更受限制。有很多代码(自定义迭代器)几乎偶然与算法一起工作,并且绝对不能使用 std::ranges 算法进行编译。