结构体作为map的key或放入set中,需要重载<运算符,如下:

typedef struct tagRoadKey
{
int m_i32Type;
int m_i32Scale; bool operator <(const tagRoadKey& other) const // 注意是const函数!!
{
if (m_i32Type != other.m_i32Type) // 类型按升序排序
{
return (m_i32Type < other.m_i32Type);
}
else // 如果类型相同,按比例尺升序排序
{
return (m_i32Scale < other.m_i32Scale);
}
} } RoadKey; 也可以重载>运算符,示例如下: #include <iostream>
#include <string>
#include <map> using namespace std; class Array
{
private:
int m_i32Num1;
int m_i32Num2; public:
Array(int i32Num1, int i32Num2);
bool operator >(const Array& other) const;
}; Array::Array(int i32Num1, int i32Num2)
{
m_i32Num1 = i32Num1;
m_i32Num2 = i32Num2;
} bool Array::operator >(const Array& other) const
{
if (m_i32Num1 > other.m_i32Num1)
{
return true;
}
else
{
return false;
}
} // 此结构体作为map的value
struct TInfo
{
int m_i32Num1;
int m_i32Num2;
}; int main(int argc, char* argv[])
{
map<Array, TInfo, greater<Array> > stMap; TInfo stInfo1 = { , };
stMap.insert(pair<Array, TInfo>(Array(, ), stInfo1)); TInfo stInfo2 = { , , };
stMap.insert(pair<Array, TInfo>(Array(, ), stInfo2)); TInfo stInfo3 = { , , };
stMap.insert(pair<Array, TInfo>(Array(, ), stInfo3)); for (map<Array, TInfo, greater<Array> >::iterator it = stMap.begin(); it != stMap.end(); ++it)
{
cout << it->second.m_i32Num1 << endl;
} return ;
}
说明:
map缺省是用less<Key>作为比较器,所以它要求作为Key的类要重载“<”操作符,没有重载“<”操作符,而是重载了“>”操作符就会报错。
反之,也可以显式地用greater<Key>作为比较器,此时就必要重载Key类中的“>”操作符了。
附:stl中map和set的声明,二者比较像,底层都是用红黑树实现的 template < class Key, class Compare = less<Key>,
class Allocator = allocator<Key> > class set; template < class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key,T> > > class map; template < class Key, class Compare = less<Key>,
class Allocator = allocator<Key> > class multiset; template < class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key,T> > > class multimap; 从上面的声明可以看出,也可以定义一个函数对象Compare,声明map或set类型时传进入,如: struct TTimeCompare
{
bool operator ()(const CTimerEvent* po1, const CTimerEvent* po2)const
{
return (po1->m_oNextTick < po2->m_oNextTick);
}
}; typedef multiset<CTimerEvent*, TTimeCompare> TEventSet; struct ltstr // less than
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < ;
}
}; set<const char*, ltstr> stSet; // set<Key, Compare, Alloc>
map<const char*, int, ltstr> stMap; // map<Key, Data, Compare, Alloc> struct eqstr // equal
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) == ;
}
}; hash_map<const char*, int, hash<const char*>, eqstr> stHashMap; // hash_map<Key, Data, HashFcn, EqualKey, Alloc> // 自定义hash函数
namespace std
{
template<>
struct hash<KEY_TYPE>
{
size_t operator()(const KEY_TYPE& key) const
{
//return key.Hash();
}
};
}

相等的时候返回false,否则报错

map重写比较器的更多相关文章

  1. 中招了,重写TreeMap的比较器引发的问题…

    需求背景 给一个无序的map,按照value的值进行排序,value值越小,排在越前面. key和value都不为null value可能相同 返回结果为一个相同的有序map 代码如下所示: 1 // ...

  2. C++ map 映照容器

    map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系. map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较, ...

  3. Map集合——双列集合

    双列集合<k, v> Map: Map 和 HashMap是无序的: LinkedHashMap是有序的: HashMap & LinkedHashMap: put方法: 其中,可 ...

  4. Map以及其子类

    package com.Map; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; i ...

  5. 重写Euqals & HashCode

    package com.test.collection; import java.util.HashMap; import java.util.Map; /** * 重写equals & ha ...

  6. java中sort方法的自定义比较器写法(转载)

    java中sort方法的自定义比较器写法 摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collecti ...

  7. sort方法和自定义比较器的写法

    摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collections.sort()方法.对自定义对象排序 ...

  8. MapReduce 常见SQL模型解析

    MapReduce应用场景 前一阵子参加炼数成金的MapReduce培训,培训中的作业例子比较有代表性,用于解释问题再好不过了.有一本国外的有关MR的教材,比较实用,点此下载. MR能解决什么问题?一 ...

  9. Java基础学习(四)-- 接口、集合框架、Collection、泛型详解

    接口 一.接口的基本概念 关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象方法的集合.也是使用.java文件编写.   二.接口声明 命名规范:与类名的命名规范相同,通常情况下 ...

随机推荐

  1. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  2. Nginx 安装与启动

    安装 第一种安装方式:CentOS 7下配置 yum 安装 Nginx. 按照官方的安装实例:https://www.nginx.com/resources/admin-guide/ 第一步,在/et ...

  3. php扩展swoole的安装

    这个明星php安装是要装php-pear yum install php-pear 然后通过pear命名安装swoole pecl install swoole 配置php.ini 添加 extens ...

  4. iPhone4 降级6.12教程 无须SHSH 不装插件 不睡死[转载] by 轻鸢

    无shsh降级电脑系统,细节操作等其它影响因素较多,不确保每个人都能成功,楼主发帖前刷机几十次均成功.步骤有些繁琐,按照步骤每一步都正确可保证最后不睡死 注意一下,无SHSH降级都是不完美的,开机需要 ...

  5. ubuntu4arm 网站参考

     1 构建ubuntu armv7文件系统:基于tiny210v2 http://blog.csdn.net/embbnux/article/details/12751465 2制作BeagleBon ...

  6. C#连接手机安装软件和发送信息

    今天突然想到怎么用winform程序连接自己的安卓手机,然后做发送短信的操作,查了很多资料 发现用ADB.exe 这个安卓自带的调试库 可以实现挺多功能的 前提是你自己手机已经和你电脑连接成功过,就是 ...

  7. KMP + 求最小循环节 --- POJ 2406 Power Strings

    Power Strings Problem's Link: http://poj.org/problem?id=2406 Mean: 给你一个字符串,让你求这个字符串最多能够被表示成最小循环节重复多少 ...

  8. 数论 + 容斥 - HDU 1695 GCD

    problem's Link mean 给定五个数a,b,c,d,k,从1~a中选一个数x,1~b中选一个数y,使得gcd(x,y)=k. 求满足条件的pair(x,y)数. analyse 由于b, ...

  9. 一个美国人对"智能制造"的思考!

    世界上制造业最强的国家仍然是美国!如今,国内工业4.0概念讨论日益喧嚣,中德合作如火如荼,但我们不能否认这个事实. “ 当下,美国似乎失去了世界第一制造大国的称号,而中国的企业也正面临产值下滑.利润下 ...

  10. 28Mybatis_查询缓存-二级缓存-二级缓存测试-

    二级缓存原理: