unordered_map笔记

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 </time.h></netinet>

<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 &amp;operator =(const Terminal&amp; term);
};

struct hash_func  //hash 函数
{
size_t operator()(const sockaddr_in &amp;addr) const
{
return addr.sin_port*9999 + addr.sin_addr.s_addr;
}
};
struct cmp_fun //比较函数 ==
{
bool operator()(const sockaddr_in &amp;addr1, const sockaddr_in &amp;addr2) const
{
return memcmp(&amp;addr1, &amp;addr2, sizeof(sockaddr_in)) == 0 ? true:false;
}
};

//typedef unordered_map<int,terminal*> MapTerminal; // Terminal socket 作为key
//typedef unordered_map<int,terminal*>::iterator MapTerminal_It; //  </int,terminal*></int,terminal*>

typedef unordered_map<sockaddr_in, terminal*,hash_func,="" cmp_fun=""> MapClientSession; // sockaddr_in作为key
typedef unordered_map<sockaddr_in, terminal*,hash_func,="" cmp_fun="">::iterator MapClientSession_It; //  </sockaddr_in,></sockaddr_in,>

#endif // CSESSION_H

operator==有两种方式 一种是

struct st
{
bool operator==(const st &amp;s) const
...
};

另一种就是自定义函数体,代码中

struct cmp_fun
{
bool operator()(...)
...
}

必须要自定义operator==hash_value。 重载operator==是因为,如果两个元素的hash_value的值相同,并不能断定这两个元素就相同,必须再调用operator==。 当然,如果hash_value的值不同,就不需要调用operator==了。

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计