sort: invalid comparator

Posted faithlocus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sort: invalid comparator相关的知识,希望对你有一定的参考价值。

1. 这是自己遇到的问题,仅做错误记录使用,比较重来没有做记录的习惯。

2. invalid comparator中文翻译:无效的比较器,尤其是使用sort函数时容易发生此问题。

3. 源码如下

#include <list>
#include <string>
#include <iostream>

using namespace std;

struct Info
{
    int id;
    string name;
    bool operator<(const Info rh) const
    {
        return id <= rh.id;
        //return id < rh.id;
    }
};

void func()
{
    list<Info> infos;
    infos.push_back({1, "1"});
    infos.push_back({3, "3"});
    infos.push_back({3, "3"});
    infos.push_back({2, "2"});
    infos.sort();
}

output:

编译正常,运行崩溃

技术图片

4. 分析原因:

4.1崩溃的位置在这里

	const auto _Result = static_cast<bool>(_Pred(_Left, _Right));
	if (_Result)
		{
		_STL_VERIFY(!_Pred(_Right, _Left), "invalid comparator");
		}

4.2 原因:

template<>
	struct less<void>
	{	// transparent functor for operator<
	typedef int is_transparent;

	template<class _Ty1,
		class _Ty2>
		constexpr auto operator()(_Ty1&& _Left, _Ty2&& _Right) const
		-> decltype(static_cast<_Ty1&&>(_Left)
			< static_cast<_Ty2&&>(_Right))
		{	// transparently apply operator< to operands
		return (static_cast<_Ty1&&>(_Left)
			< static_cast<_Ty2&&>(_Right));
		}
	};

结论:

  1. 使用less时,传入的比较器必须是operator<,而不能是operator<=。
  2. less就是less,less不是less_equal
  3. 不要想加上等于就可以不调换相等的元素了,这是错误的想法(在说自己)

4.3 代码修正

    bool operator<(const Info rh) const
    {
        // return id <= rh.id;
        return id < rh.id;
    }

以上是关于sort: invalid comparator的主要内容,如果未能解决你的问题,请参考以下文章

简述Comparator和Collections.sort(),及基于此的Map排序

Java—集合框架 Collections.sort()Comparable接口和Comparator接口

Comparators.sort (转载)

Comparable和Comparator比较实现排序 场景分析

java 中的2个接口 Comparable和Comparator

list集合的排序Comparator和Collections.sort