STL set重载比较函数

接触STL以后,就被它的简单易用吸引住了,今天工作中用到了SET关联容器的重载。

在这儿记录下来,也温习一遍。

需求要求打印一组数据,数据结构如下:

struct POIinfo
{
    string NameC;
    int Featcode;
    int MeshID;
    int PoiID;
    bool IsTourClass;
};

我想到把这个POIinfo放到set中,通过迭代器一一打印出来。

打印的排序要求是:

NameC名称一样的排在一起,如果名字一样那么IsTourClass是true 的排在前面。
如果IsTourClass都是true或者false,那么Featcode小的排在前面。
如果Featcode相等,那么MeshID小的排在前面。
如果MeshIDea相等,那么PoiID小的排在前面。


偶然的机会看到set可以重载排序函数(之前一直没有彻底搞清楚什么是重载)
使用
bool operator()(const POIinfo& info1,const POIinfo& info2)const   
    {
		return info1.NameC < info2.NameC;
    }
就可以实现重载排序。但是因为不知道其中的因果作用,所以复杂的排序方式,还是没有实现。
我现在的理解是重载后的返回值决定了这个值是排在set的前一个值得前面还是后面,return TRUE 则info1排在前面,反之info2排在前面。
知道了这个规则结合排序原则,那么下面就是:
    bool operator()(const POIinfo& info1,const POIinfo& info2) const   
    {
        // NameC名称一样的排在一起
        if (info1.NameC != info2.NameC)
            return info1.NameC < info2.NameC;

        // 如果名字一样那么IsTourClass是true 的排在前面
        if (info1.IsTourClass == true && info2.IsTourClass == false)
            return true;
        if (info1.IsTourClass == false && info2.IsTourClass == true)
            return false;

        // 如果IsTourClass都是true或者false,那么Featcode小的排在前面
        if (info1.Featcode != info2.Featcode)
            return info1.Featcode < info2.Featcode;

        // 如果Featcode相等,那么MeshID小的排在前面
        if (info1.MeshID != info2.MeshID)
            return info1.MeshID < info2.MeshID;

        // 如果MeshID相等,那么PoiID小的排在前面。
        return info1.PoiID < info2.PoiID;
    }

我查看了set的源码,里面分别可是实现对== != < > <= >=重载,所以以上的方式可以满足需求排序。
		// set TEMPLATE OPERATORS
template<class _K, class _Pr, class _A> inline
	bool operator==(const set<_K, _Pr, _A>& _X,
		const set<_K, _Pr, _A>& _Y)
	{return (_X.size() == _Y.size()
		&& equal(_X.begin(), _X.end(), _Y.begin())); }
template<class _K, class _Pr, class _A> inline
	bool operator!=(const set<_K, _Pr, _A>& _X,
		const set<_K, _Pr, _A>& _Y)
	{return (!(_X == _Y)); }
template<class _K, class _Pr, class _A> inline
	bool operator<(const set<_K, _Pr, _A>& _X,
		const set<_K, _Pr, _A>& _Y)
	{return (lexicographical_compare(_X.begin(), _X.end(),
		_Y.begin(), _Y.end())); }
template<class _K, class _Pr, class _A> inline
	bool operator>(const set<_K, _Pr, _A>& _X,
		const set<_K, _Pr, _A>& _Y)
	{return (_Y < _X); }
template<class _K, class _Pr, class _A> inline
	bool operator<=(const set<_K, _Pr, _A>& _X,
		const set<_K, _Pr, _A>& _Y)
	{return (!(_Y < _X)); }
template<class _K, class _Pr, class _A> inline
	bool operator>=(const set<_K, _Pr, _A>& _X,
		const set<_K, _Pr, _A>& _Y)
	{return (!(_X < _Y)); }

到此时,我真正见识了重载的威力,但是我对它还是半知半解,还需要继续努力,如有不正确的地方,欢迎指正。
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值