如何在排序函数中使用 rbegin()

how to work with rbegin() inside sort function?

本文关键字:rbegin 排序 函数      更新时间:2023-10-16

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

"effort"

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

"erofft"

我使用函数排序为:

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

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

我认为为此

使用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,但这不是正确的方法。std::basic_string有一个特征模板参数,用于决定如何比较和排序字符串。它可能具有使字符串不区分大小写的自定义特征。我的版本正确地使用了它。