在c++编程中使用sort函数,自定义一个数据结构并进行排序时新手经常会碰到这种错误。

这是为什么呢?原因在于什么?如何解决?

看下面一个例子:

  1. int main(int, char*[])
  2. {
  3. struct ItemDesc
  4. {
  5. int val;
  6. std::string content;
  7. };
  8. std::vector<ItemDesc> dataList = {
  9. ItemDesc{ , "hello" },
  10. ItemDesc{ , "aello" },
  11. ItemDesc{ , "hello" },
  12. ItemDesc{ , "xello" },
  13. ItemDesc{ , "hellx" }
  14. };
  15. std::sort(dataList.begin(), dataList.end(), [](const ItemDesc& lhs, const ItemDesc& rhs){
  16. return (lhs.val <= rhs.val);
  17. });
  18. return ;
  19. }

这段代码在vs2013上就会触发上述断言错误。

std::sort可能在比较的过程中对同一对数据进行多次比较,必须保证同一对数据多次比较结果是一致的。即:

当lhs为ItemDesc{ 0, "hello" },而rhs为ItemDesc{ 0, "hellx" },返回true,第二次比较并且顺序交换后,即ItemDesc{ 0, "hellx" },而rhs为ItemDesc{ 0, "hello" },它应该返回false。

而上述函数无法保证这一点。

所以可以改成下面这样:

  1. int main(int, char*[])
  2. {
  3. struct ItemDesc
  4. {
  5. int val;
  6. std::string content;
  7. };
  8. std::vector<ItemDesc> dataList = {
  9. ItemDesc{ , "hello" },
  10. ItemDesc{ , "aello" },
  11. ItemDesc{ , "hello" },
  12. ItemDesc{ , "xello" },
  13. ItemDesc{ , "hellx" }
  14. };
  15. std::sort(dataList.begin(), dataList.end(), [](const ItemDesc& lhs, const ItemDesc& rhs){
  16. //main filed
  17. if (lhs.val < rhs.val)
  18. {
  19. return true;
  20. }else if (lhs.val > rhs.val)
  21. {
  22. return false;
  23. }
  24. else
  25. {
  26. //compare other data filed
  27. //...
  28. return lhs.content < rhs.content;
  29. }
  30. });
  31. return ;
  32. }

c++ std::sort函数调用经常出现的invalidate operator<错误原因以及解决方法的更多相关文章

  1. c++中sort函数调用报错Expression : invalid operator <的内部原理 及解决办法

    转自:https://www.cnblogs.com/huoyao/p/4248925.html 当我们调用sort函数进行排序时,中的比较函数如果写成如下 bool cmp(const int &a ...

  2. c++中sort函数调用报错Expression : invalid operator <的内部原理

    当我们调用sort函数进行排序时,中的比较函数如果写成如下 bool cmp(const int &a, const int &b) { if(a!=b) return a<b; ...

  3. 将三维空间的点按照座标排序(兼谈为std::sort写compare function的注意事项)

    最近碰到这样一个问题:我们从文件里读入了一组三维空间的点,其中有些点的X,Y,Z座标只存在微小的差别,远小于我们后续数据处理的精度,可以认为它们是重复的.所以我们要把这些重复的点去掉.因为数据量不大, ...

  4. 源码阅读笔记 - 1 MSVC2015中的std::sort

    大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...

  5. std::sort引发的core

    #include <stdio.h> #include <vector> #include <algorithm> #include <new> str ...

  6. 一个std::sort 自定义比较排序函数 crash的分析过程

    两年未写总结博客,今天先来练练手,总结最近遇到的一个crash case. 注意:以下的分析都基于GCC4.4.6 一.解决crash 我们有一个复杂的排序,涉及到很多个因子,使用自定义排序函数的st ...

  7. Qt使用std::sort进行排序

    参考: https://blog.csdn.net/u013346007/article/details/81877755 https://www.linuxidc.com/Linux/2017-01 ...

  8. 非常无聊——STD::sort VS 基数排序

    众所周知,Std::sort()是一个非常快速的排序算法,它基于快排,但又有所修改.一般来说用它就挺快的了,代码一行,时间复杂度O(nlogn)(难道不是大叫一声“老子要排序!!”就排好了么...). ...

  9. 今天遇到的一个诡异的core和解决 std::sort

    其实昨天开发pds,就碰到了core,我还以为是内存不够的问题,或者其他问题. 今天把所有代码挪到了as这里,没想到又出core了. 根据直觉,我就觉得可能是std::sort这边的问题. 上网一搜, ...

随机推荐

  1. iframe与frameset(转载)

    frameset 在一个页面中设置一个或多个框架 不能嵌套在body标签里 frameset        它称为框架标记,是用来告知HTML文件是框架模式,并且设定可视窗口怎么分割 fram     ...

  2. hdu5443(2015长春赛区网络赛1007)暴力

    题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. #include< ...

  3. Mac上因磁盘格式导致gulp无限刷新问题

    今天遇到个超奇葩的问题,使用gulp.watch监控文件变化,但是并没有修改文件,却一直执行change,导致浏览器无限刷新 调试了10小时,代码各种删改,一直不得其解.切换到Windows运行,又正 ...

  4. ps命令详解(转)

    原文地址:http://apps.hi.baidu.com/share/detail/32573968 有时候系统管理员可能只关心现在系统中运行着哪些程序,而不想知道有哪些进程在运行.由于一个应用程序 ...

  5. java的nio之:java的nio系列教程之channel的概念

    一:java的nio的channel Java NIO的通道类似流,但又有些不同: ==>既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. ==>通道可以异步地读写. ...

  6. 将caffe训练时loss的变化曲线用matlab绘制出来

    1. 首先是提取 训练日志文件; 2. 然后是matlab代码: clear all; close all; clc; log_file = '/home/wangxiao/Downloads/43_ ...

  7. DNS与DSN

    dns是域名系统的缩写 dsn在一些专业书籍中是数据源的缩写

  8. share point 读取 metadata

    private static void syncMetaData() { var siteUrl = @"http://..."; using (var site = new SP ...

  9. div+css关于overflow 动态滚动效果

    http://www.ablanxue.com/prone_2613_1.html 关于overflow:hidden不起作用的说明

  10. Create STATISTICS,UPDATE STATISTICS

    该命令在一张表或者索引了的视图上更新查询优化统计数字信息. 默认情况下, 查询优化器已经更新了必要的用来提高查询计划的统计信息; 在某些情况下, 你可以通过使用UPDATE STATISTICS 命令 ...