码迷,mamicode.com
首页 > 其他好文 > 详细

sort: invalid comparator

时间:2020-07-30 16:56:31      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:iostream   lang   less   习惯   错误   http   name   result   tran   

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

标签:iostream   lang   less   习惯   错误   http   name   result   tran   

原文地址:https://www.cnblogs.com/faithlocus/p/13404111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!