c++ std::sort函数调用经常出现的invalidate operator<错误原因以及解决方法
在c++编程中使用sort函数,自定义一个数据结构并进行排序时新手经常会碰到这种错误。

这是为什么呢?原因在于什么?如何解决?
看下面一个例子:
int main(int, char*[])
{
struct ItemDesc
{
int val;
std::string content;
};
std::vector<ItemDesc> dataList = {
ItemDesc{ , "hello" },
ItemDesc{ , "aello" },
ItemDesc{ , "hello" },
ItemDesc{ , "xello" },
ItemDesc{ , "hellx" }
};
std::sort(dataList.begin(), dataList.end(), [](const ItemDesc& lhs, const ItemDesc& rhs){
return (lhs.val <= rhs.val);
});
return ;
}
这段代码在vs2013上就会触发上述断言错误。
std::sort可能在比较的过程中对同一对数据进行多次比较,必须保证同一对数据多次比较结果是一致的。即:
当lhs为ItemDesc{ 0, "hello" },而rhs为ItemDesc{ 0, "hellx" },返回true,第二次比较并且顺序交换后,即ItemDesc{ 0, "hellx" },而rhs为ItemDesc{ 0, "hello" },它应该返回false。
而上述函数无法保证这一点。
所以可以改成下面这样:
int main(int, char*[])
{
struct ItemDesc
{
int val;
std::string content;
};
std::vector<ItemDesc> dataList = {
ItemDesc{ , "hello" },
ItemDesc{ , "aello" },
ItemDesc{ , "hello" },
ItemDesc{ , "xello" },
ItemDesc{ , "hellx" }
};
std::sort(dataList.begin(), dataList.end(), [](const ItemDesc& lhs, const ItemDesc& rhs){
//main filed
if (lhs.val < rhs.val)
{
return true;
}else if (lhs.val > rhs.val)
{
return false;
}
else
{
//compare other data filed
//...
return lhs.content < rhs.content;
}
});
return ;
}
c++ std::sort函数调用经常出现的invalidate operator<错误原因以及解决方法的更多相关文章
- c++中sort函数调用报错Expression : invalid operator <的内部原理 及解决办法
转自:https://www.cnblogs.com/huoyao/p/4248925.html 当我们调用sort函数进行排序时,中的比较函数如果写成如下 bool cmp(const int &a ...
- c++中sort函数调用报错Expression : invalid operator <的内部原理
当我们调用sort函数进行排序时,中的比较函数如果写成如下 bool cmp(const int &a, const int &b) { if(a!=b) return a<b; ...
- 将三维空间的点按照座标排序(兼谈为std::sort写compare function的注意事项)
最近碰到这样一个问题:我们从文件里读入了一组三维空间的点,其中有些点的X,Y,Z座标只存在微小的差别,远小于我们后续数据处理的精度,可以认为它们是重复的.所以我们要把这些重复的点去掉.因为数据量不大, ...
- 源码阅读笔记 - 1 MSVC2015中的std::sort
大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格 ...
- std::sort引发的core
#include <stdio.h> #include <vector> #include <algorithm> #include <new> str ...
- 一个std::sort 自定义比较排序函数 crash的分析过程
两年未写总结博客,今天先来练练手,总结最近遇到的一个crash case. 注意:以下的分析都基于GCC4.4.6 一.解决crash 我们有一个复杂的排序,涉及到很多个因子,使用自定义排序函数的st ...
- Qt使用std::sort进行排序
参考: https://blog.csdn.net/u013346007/article/details/81877755 https://www.linuxidc.com/Linux/2017-01 ...
- 非常无聊——STD::sort VS 基数排序
众所周知,Std::sort()是一个非常快速的排序算法,它基于快排,但又有所修改.一般来说用它就挺快的了,代码一行,时间复杂度O(nlogn)(难道不是大叫一声“老子要排序!!”就排好了么...). ...
- 今天遇到的一个诡异的core和解决 std::sort
其实昨天开发pds,就碰到了core,我还以为是内存不够的问题,或者其他问题. 今天把所有代码挪到了as这里,没想到又出core了. 根据直觉,我就觉得可能是std::sort这边的问题. 上网一搜, ...
随机推荐
- MySQL备份的shell脚本
经过测试该脚本可以远程备份,但需要配置远程登录用户的权限,经过测试啊,在把这个脚本添加到计划任务的时候是无法识别mysql命令的(即使是将mysql添加到环境变量也无法识别,是因为/etc/cront ...
- Codeforces Round #113 (Div. 2)
Codeforces Round #113 (Div. 2) B. Polygons 题意 给一个\(N(N \le 10^5)\)个点的凸包 \(M(M \le 2 \cdot 10^4)\)次询问 ...
- c语言开发手机通讯录
// // main.c // 手机通讯录 // // Created by Kevin-Dfg on 16/4/19. // Copyright © 2016年 Kevin-Dfg. All ...
- Dtrace for Linux 2016
http://www.brendangregg.com/blog/2016-10-27/dtrace-for-linux-2016.html
- python tornado框架使用
处理方法 t_handler.py from tornado.web import RequestHandler class IndexHandler(RequestHandler): def get ...
- CSS浮动讲解好文章推荐
经验分享:CSS浮动(float,clear)通俗讲解 http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 好文推荐!
- 如何将SQL Server 2008库导入2000中
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- unity,将camera设为don't clear在android上会显示不正常
将camera设置为don't clear,在pc和ios上显示没问题,但在android上显示不正常,改为only depth可以.
- html之label标签
label标签为input元素定义标注,label标签与相关元素通过id属性绑定在一起. 相关属性: for:规定label绑定到哪个表单元素 form:规定label字段所属的一个或多个表单 示例代 ...
- mysql sys table
本文详细地介绍了MySQL 5.7新引入的sys schema.首先,本文概要地介绍了sys schema的作用和定位:其次,分别介绍了sys schema中的视图.函数和存储过程:接下来,通过两个例 ...