zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    mas_makeConstraints && mas_remakeConstraints && mas_updateConstraints 用法与注意事项
    iOS特性一 关闭系统日志打印
    React-Native -课后练习
    RN 项目导入WebStorm 组件没有依赖
    React-Native需要css和布局-20160902
    方式 隐藏导航栏
    svn status状态
    spring整合redis
    maven编译跳过TEST
    linux自动登录脚本expect
  • 原文地址:https://www.cnblogs.com/miraclecoder/p/4209132.html
Copyright © 2011-2022 走看看