【问题标题】:invalid operator < while sorting std::list对 std::list 进行排序时,运算符 < 无效
【发布时间】:2012-01-21 20:45:50
【问题描述】:

我有一个 std::list 图形边缘,我想根据它们的目标出度和入度对边缘进行排序。但是在我的比较函数中,我得到了无效运算符

bool compareEdges(const Edge  *e1,const Edge *e2){
if(e1->destination->outdegree < e2->destination->outdegree){
    return true;
}
else if(e1->destination->outdegree > e2->destination->outdegree){
    return false;
}
else if(e1->destination->indegree > e2->destination->indegree){
        return false;
    }
return true;

}

这是对排序函数的调用。

currentNode->edgeList.sort(compareEdges);

请帮助我消除此异常。

谢谢

【问题讨论】:

  • (currentNode-&gt;edgeList).sort(compareEdges); 有帮助吗?
  • outdegreeindegree的类型有哪些?
  • outdegree 的类型是什么??
  • 你能发布outdegree的数据类型吗?或者甚至更好的 Edge 数据结构?
  • 什么是出度,什么是入度?你真的得到一个异常或只是一个编译器错误。请发布您得到的确切错误。

标签: c++ list exception sorting stl


【解决方案1】:

当两个相关字段相等时,您的比较器返回 true。这是无效的,所以很可能是sort 实现通过断言检测到的。

您应该将“小于”谓词传递给sort:正式地是“严格的弱顺序”。其他任何事情都是未定义的行为。在这种情况下,您似乎很幸运,并且实现检测到由于比较不一致而陷入了不可能的情况。

【讨论】:

  • 如果我认为两件事相等,排序必须做什么,它只需要返回 true 或 false 值。如果想首先在出度的基础上对边缘进行排序,如果它们相同,那么在入度的基础上,您能否详细说明一下应该如何处理。
  • 当它们相等时它必须返回false,恐怕你的意见不会进入它;-)比较器的行为应该像“小于”,而x &lt; x是错误的。如果您想知道确切的要求,请查看“严格弱顺序”的定义。
  • 那么你的意思是当两个值相等时我不应该返回任何东西?
  • @AbdulSamad,只是你最终得到了a &lt; bb &lt; a 两者都是真的。
  • @Abdul:不,我并不是说你不应该返回任何东西。我的意思是我说的,返回false
猜你喜欢
  • 2021-10-28
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
相关资源
最近更新 更多