提问人:Vlad 提问时间:3/12/2010 最后编辑:JamalVlad 更新时间:4/21/2022 访问量:18831
使用 STL 排序功能对列表进行排序
Sort list using STL sort function
问:
我正在尝试按降序对包含 的项的列表(类的一部分)进行排序,但它没有编译: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;
}
};
谁能告诉我怎么了?
答:
10赞
Konrad Rudolph
3/12/2010
#1
std::list
有一个您需要使用的内置方法,因为仅适用于随机访问迭代器,而仅属于迭代器的双向迭代器类。sort
std::sort
std::list::iterator
Result.poly.sort(SortDescending());
此外,您应标记为 .operator ()
const
struct SortDescending
{
bool operator()(const term& t1, const term& t2) const
{
return t2.pow < t1.pow;
}
};
最后,如果类型重载了适当的内容,您可能不需要编写自己的比较器进行排序 - 只需使用(位于标准标题中):term
operator>
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:我担心的是临时对象被传递到函数中。我忘记了比较器是按值传递的,并且由于临时变量不能绑定到非引用,因此要求函数为 .sort
const
const
1赞
UncleBens
3/13/2010
std::greater
只有在过载时才有效,而这里可能不是这种情况。operator>
term
4赞
Andreas Brinck
3/12/2010
#2
似乎缺少迭代器类型。 不适用于更改为Result.poly
operator -
std::sort
std::list
Result.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::sort
std::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
评论