首页 > 解决方案 > 如何在排序函数中使用 rbegin()?

问题描述

我正在尝试使用排序函数对字符串进行排序:这是一个字符串:索引从零开始

"effort"

我的目标是按降序从索引(1 到 4)[n=1,m=4]进行排序,即生成一个字符串:

"erofft"

我使用函数排序为:

sort( str.rbegin()+ (str.length()-1-m) , str.rbegin()+ (str.length()-1-n) );

但这似乎不起作用:我想我很难理解rbegin()迭代器。

标签: c++sorting

解决方案


我认为使用rbegin它没有意义。您只需要一个带有自定义比较器的排序:

std::sort(str.begin() + 1, str.begin() + 5, [](auto l, auto r) {
    using Trait = std::remove_reference_t<decltype(str)>::traits_type;
    return !Trait::lt(l, r) && !Trait::eq(l, r);
});

对上面的一点解释:

  • 对于标准库中的所有范围,末尾是排他的,所以我们需要在[1, 5)范围内进行排序。

  • sort有一个接受自定义比较器的重载。这个自定义比较器在两个元素之间决定谁先来。我们为此使用 lambda。

  • 要决定哪个元素先出现,我们可以这样做l > r,但这不是正确的方法。Astd::basic_string有一个 traits 模板参数,它决定如何比较和排序字符串。它可能具有使字符串不区分大小写的自定义特征。我的版本正确地使用了它。


推荐阅读