使用 STL 排序功能对列表进行排序

Sort list using STL sort function

提问人:Vlad 提问时间:3/12/2010 最后编辑:JamalVlad 更新时间:4/21/2022 访问量:18831

问:

我正在尝试按降序对包含 的项的列表(类的一部分)进行排序,但它没有编译:struct

错误:“__last - __first”中的“operator-”不匹配

sort(Result.poly.begin(), Result.poly.end(), SortDescending());

这里是:SortDescending

struct SortDescending
{
    bool operator()(const term& t1, const term& t2)
    { 
        return t2.pow < t1.pow; 
    }
};

谁能告诉我怎么了?

C++ 列表 STL 排序

评论

0赞 Vlad 3/12/2010
@Glen看到 stackoverflow.com/questions/2425452/......

答:

10赞 Konrad Rudolph 3/12/2010 #1

std::list有一个您需要使用的内置方法,因为仅适用于随机访问迭代器,而仅属于迭代器的双向迭代器类。sortstd::sortstd::list::iterator

Result.poly.sort(SortDescending());

此外,您应标记为 .operator ()const

struct SortDescending
{
    bool operator()(const term& t1, const term& t2) const
    { 
        return t2.pow < t1.pow; 
    }
};

最后,如果类型重载了适当的内容,您可能不需要编写自己的比较器进行排序 - 只需使用(位于标准标题中):termoperator>std::greater<T><functional>

Result.poly.sort(std::greater<term>());

评论

0赞 Andreas Brinck 3/12/2010
不,输入迭代器缺少此 isnoperator -'。t it, there's nothing in the standard that says that this needs to be const. If you look at the error message it seems like
0赞 visitor 3/12/2010
如果重新排序,它会做出更好的答案(一致性在这里是一个附带问题)。
0赞 Vlad 3/12/2010
仍然不能用我自己的比较器或使用 greater() 它仍然会产生一堆错误
0赞 Konrad Rudolph 3/12/2010
@Andreas:我担心的是临时对象被传递到函数中。我忘记了比较器是按值传递的,并且由于临时变量不能绑定到非引用,因此要求函数为 .sortconstconst
1赞 UncleBens 3/13/2010
std::greater只有在过载时才有效,而这里可能不是这种情况。operator>term
4赞 Andreas Brinck 3/12/2010 #2

似乎缺少迭代器类型。 不适用于更改为Result.polyoperator -std::sortstd::listResult.poly.sort

评论

0赞 Vlad 3/12/2010
但是我不知道如何正确地重载我的类的 less 运算符
0赞 Andreas Brinck 3/12/2010
@Vlad你可以用 来称呼它,就不需要 。Result.poly.sort(SortDescending())operator <
0赞 Andreas Brinck 3/12/2010
@Konrad我认为他是在谈论并且错过了这样一个事实,即有一个版本需要谓语。operator <std::ist::sort
44赞 David Rodríguez - dribeas 3/12/2010 #3

标准算法需要随机访问迭代器,而随机访问迭代器不是(列表迭代器是双向迭代器)。std::sortstd::list<>::iterator

您应该使用成员函数。std::list<>::sort

评论

0赞 Vlad 3/12/2010
但是我不知道如何正确地重载我的类的 less 运算符
2赞 Glen 3/12/2010
@Vlad,您不需要超载任何东西。 应该工作得很好。Result.poly.sort(SortDescending());
1赞 Konrad Rudolph 3/12/2010
在比较器中仍应标记,因为它不会修改任何成员。operator ()const