为什么 sort(rbegin(), rend()) 按降序对结构进行排序?

Awe*_*JSF 1 c++ sorting algorithm iterator reverse-iterator

例如,下面的代码按 desc 顺序对 vec 进行排序:

std::vector<int> vec = {1, 2, 5, 4, 3};
sort(vec.rbegin(), vec.rend());
for(const auto v : vec)
    std::cout << v << "\n";
output 5 4 3 2 1
Run Code Online (Sandbox Code Playgroud)

关于C++ 参考

将范围 [first,last) 中的元素按升序排序。对于第一个版本,使用运算符 < 来比较元素 [...]

Vla*_*cow 6

该函数调用确实按升序对向量进行排序,从最后一个元素开始到第一个元素,因为使用了反向迭代器

sort(vec.rbegin(), vec.rend());
Run Code Online (Sandbox Code Playgroud)

当您使用反向迭代器时,向量将以相反的顺序遍历。

考虑这个 for 循环

for (auto first = vec.rbegin(), last = vec.rend(); first != last; ++first)
{
    std::cout << *first << ' ';
}
std::cout << '\n';
Run Code Online (Sandbox Code Playgroud)

它的输出是

3 4 5 2 1
Run Code Online (Sandbox Code Playgroud)

如果您想在直接方向上按升序对向量进行排序,则不要使用反向迭代器。例如

sort(vec.begin(), vec.end());
Run Code Online (Sandbox Code Playgroud)

std::less<int>或者,如果要使用反向迭代器,则需要使用该类型的函数对象,而不是该类型的默认函数对象std::greater<int>

sort( vec.rbegin(), vec.rend(), std::greater<int>() );
Run Code Online (Sandbox Code Playgroud)