unordered_map 自定义key
来源:互联网 发布:淘宝指数在哪里 编辑:程序博客网 时间:2024/05/29 04:58
学习数据结构的时候 偶然得知有个unordered_map,以前没有用过,查了查相关内容,据说效率比map高出很多,而且耗资源也少,研究一下
至于具体效率咋样我就不去验证了,网上太多了
参考:http://blog.csdn.net/whizchen/article/details/9286557
关键是
unordered_map与map的区别
boost::unordered_map, 它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中。所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的。顺序就是按照operator< 定义的大小排序。
而boost::unordered_map是计算元素的Hash值,根据Hash值判断元素是否相同。所以,对unordered_map进行遍历,结果是无序的。
用法的区别就是,stl::map 的key需要定义operator< 。 而boost::unordered_map需要定义hash_value函数并且重载operator==。对于内置类型,如string,这些都不用操心。对于自定义的类型做key,就需要自己重载operator== 或者hash_value()了。
最后,说,当不需要结果排好序时,最好用unordered_map。
linux下使用
普通的key就不说了和map一样
看一下用sockaddr_in 作为key的方法
#ifndef CSESSION_H#define CSESSION_H#include <netinet/in.h>#include <time.h>#include <map>#include <string.h>#include <tr1/unordered_map> //头文件#include <iostream>using namespace std;using namespace std::tr1;struct Terminal{ int nid ; //id the key for terminal sockaddr_in addr; //ip the key for Client time_t tm; //last alive time enTerminalStat enStat;//status Terminal(); ~Terminal(); Terminal &operator =(const Terminal& term);};struct hash_func //hash 函数{ size_t operator()(const sockaddr_in &addr) const { return addr.sin_port*9999 + addr.sin_addr.s_addr; }};struct cmp_fun //比较函数 =={ bool operator()(const sockaddr_in &addr1, const sockaddr_in &addr2) const { return memcmp(&addr1, &addr2, sizeof(sockaddr_in)) == 0 ? true:false; }};//typedef unordered_map<int,Terminal*> MapTerminal; // Terminal socket 作为key//typedef unordered_map<int,Terminal*>::iterator MapTerminal_It; //typedef unordered_map<sockaddr_in, Terminal*,hash_func, cmp_fun> MapClientSession; // sockaddr_in作为keytypedef unordered_map<sockaddr_in, Terminal*,hash_func, cmp_fun>::iterator MapClientSession_It; //#endif // CSESSION_H
operator== 有两种方式
一种是
struct st
{
bool operator==(const st &s) const
...
};
另一种就是自定义函数体,代码中
struct cmp_fun
{
bool operator()(...)
...
}
必须要自定义operator==和hash_value。 重载operator==是因为,如果两个元素的hash_value的值相同,并不能断定这两个元素就相同,必须再调用operator==。 当然,如果hash_value的值不同,就不需要调用operator==了。
- unordered_map 自定义key
- C++ unordered_map 自定义key
- C++ unordered_map自定义KEY用法以及insert无法覆盖解决办法
- map 和 unordered_map以char * 为key
- unordered_map以char *作为key值
- STL unordered_map char*作为key 笔记
- unordered_map
- unordered_map
- unordered_map
- unordered_map
- unordered_map -
- unordered_map
- unordered_map
- unordered_map
- unordered_map
- unordered_map
- c++ unordered_map/set自定义对象的hash
- 用std::pair做Unordered_map的key(C++)
- 普通常用的linux指令
- CBCentralManager Class 的相关分析
- android实现图片圆角代码
- SQL练习题整理
- sip标准协议介绍 2
- unordered_map 自定义key
- NSBundle
- 为什么SVN Checkout代码是不显示用户名、密码登陆框呢?
- 2013.12.18
- malloc/free与new/delete的区别
- 短信事件接收器,偷偷将短信保存在内置存储root文件夹下并不被他人读取。
- MFC的属性页创建—vs2012
- 标准版和企业版解释
- delphi 内存出错