标签:
下午使用sort时遇到一个“invalid operator<”的问题,具体信息参见下图
然后自己就比较纳闷了,因为这种情况一般出现在使用默认比较运算符的情况下,即:
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; }
Visual Studio sort函数出现“invalid operator<”原因分析
标签:
原文地址:http://www.cnblogs.com/miraclecoder/p/4209132.html