Visual Studio sort函数出现“invalid operator<”原因分析

下午使用sort时遇到一个“invalid operator<”的问题,具体信息参见下图

image

然后自己就比较纳闷了,因为这种情况一般出现在使用默认比较运算符的情况下,即:

template <class RandomAccessIterator>
  void sort (RandomAccessIterator first, RandomAccessIterator last);

但是自己明明使用的是重载函数的第二种函数,即:

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

后来通过查询网上资料,自己发现问题的原因是VC对于比较函数会进行strict weak ordering确认。(这个刚查到还有点惊讶)

直接摘抄官方网站中解释:

Results:

It works fine in Visbual C++ 2002 and Visual C++ 2003.
It throws and assertion failed error, "Expression: invalid operator < " in Visual C++  2005 and Visual C++ /2008.

Cause:

The STL algorithms for stable_sort() and sort() require the binary predicate to be strict weak ordering.
For example:
· Strict: pred(X, X) is always false.
· Weak: If !pred(X, Y) && !pred(Y, X), X==Y.
· Ordering: If pred(X, Y) && pred(Y, Z), then pred(X, Z).

对比自己的代码,发现问题出在pred(X, X) = true,那么解决办法就产生了(<=替换成<)。

最后附上自己初始代码中的比较函数

// 比较两条边的权重
bool compare_edge( const Edge & e1, const Edge & e2 )
{
    return e1.weight <= e2.weight;
}
原文地址:https://www.cnblogs.com/miraclecoder/p/4209132.html