c++ - 如何在排序函数中使用 rbegin()?
问题描述
我正在尝试使用排序函数对字符串进行排序:这是一个字符串:索引从零开始
"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
,但这不是正确的方法。Astd::basic_string
有一个 traits 模板参数,它决定如何比较和排序字符串。它可能具有使字符串不区分大小写的自定义特征。我的版本正确地使用了它。