【问题标题】:Why sort(rbegin(), rend()) sort the structure on descending order? [closed]为什么 sort(rbegin(), rend()) 按降序对结构进行排序? [关闭]
【发布时间】:2022-01-20 11:56:51
【问题描述】:

例如下面的代码按 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

C++ reference

将 [first,last) 范围内的元素按升序排序。对于第一个版本,使用 operator

【问题讨论】:

  • 该参考在措辞上本来就不好,但是如果您查看rbegin()rend()实际上做了什么,很清楚为什么sort()会这样,尽管“参考”中的措辞"。
  • 这应该是关于what rbegin and rend mean的问题。似乎很清楚 std::sort 并不是让 OP 感到困惑的原因。该代码声称会产生“输出”,但如果不以相反的顺序读取向量,这里就没有输出。
  • 对不起,对于我正在使用的输出 for(const auto v : vec) std::cout
  • @AwesomeJSF 这是一个有用的编辑。那个for循环使用begin()end()。其中以 rbegin()rend() 的相反顺序迭代。

标签: c++ algorithm sorting iterator reverse-iterator


【解决方案1】:

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

sort(vec.rbegin(), vec.rend());

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

考虑一下这个 for 循环

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

它的输出是

3 4 5 2 1

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

sort(vec.begin(), vec.end());

或者如果要使用反向迭代器,那么您需要使用std::greater&lt;int&gt; 类型的函数对象,而不是std::less&lt;int&gt; 类型的默认函数对象

sort( vec.rbegin(), vec.rend(), std::greater<int>() );

【讨论】:

  • 另外值得注意的是 vec.rbegin() + 1 是数组中倒数第二个元素。注意 positive 偏移量 (+1)。这意味着“升序”顺序以迭代器的正迭代顺序应用。您可以创建一个自定义迭代器,以其他任意顺序(可能是交错 FFT 蝶形或任何其他奇异顺序)遍历数组,以创建穿过数组中项目的路径,sort 将按升序排列项目 沿着那条路。
  • @Wyck 谢谢,我不知道如何标记您对“已接受答案”的评论。
猜你喜欢
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多