zoukankan      html  css  js  c++  java
  • STL sort的危险之处

    STL可以进行自动排序,调用algorithm里面的sort函数。但该方法的调用需要一些前提。STL::sort要求被排序的对象必须是顺序确定的。例如:

    class TestClass 
    {
    public:
    int a;
    int b;
    bool operator < (const TestClass& rhs)
    {
    return this->a < rhs.a;
    }

    };

    因为两个给定的Test1对象, 调用<的时候的结果是一致的。

    但是如果以下情况:

    class TestClass 
    {
    public:
    int a;
    int b;
    bool operator < (const TestClass& rhs) {
    bool bRet = ((this->a < rhs.a) || (this->b < rhs.b));
    return bRet;
    }
    };

     对于obj1(a = 1, b = 4)和obj2(a = 2, b = 3)来说, obj1 < obj2的结果是真, 而obj2 < obj1的结果也是真, 这样, stl::sort就会出错。

    主要的原因是在stl::sort的内部, 由于这种无法判断两个元素大小的问题, 导致迭代器失效. 这次不是因为用户erase让其失效的, 而是因为没有遵守stl::sort的前置条件, 而导致的内部迭代器失效, 比平常发生的失效更加的隐藏. 
         可能看到这个错误会觉得怎么可能写出这种逻辑呢, 但是有时候在实现业务逻辑的时候, 就是很难发现这样的和程序内建必要条件相矛盾的地方, 从而产生错误.

  • 相关阅读:
    乐观锁和悲观锁
    c++ inline使函数实现可以在头文件中,避免多重定义错误
    无锁队列的实现
    同步异步阻塞非阻塞
    log(m+n)找第k大
    ios开发常见的 工具 - 值得收藏
    iOS 性能优化得 方法
    搭建 安卓开发环境 !
    项目支持 64 - bit
    AFN学习笔记
  • 原文地址:https://www.cnblogs.com/flysnail/p/2355906.html
Copyright © 2011-2022 走看看