STL::unordered_map之无序map

class template

unordered_map 

template < class Key,                                     //unordered_map::key_type

           class T,                                                 //unordered_map::mapped_type

           class Hash = hash,                      // unordered_map::hasher

           class Pred =equal_to,                   //unordered_map::key_equal

           class Alloc = allocator >     // unordered_map::allocator_type

           > class unordered_map; 

 

Unordered Map

哈希map是一种关联容器,通过键值和映射值存储元素。允许根据键值快速检索各个元素。

在unordered_map中,键值一般用来唯一标识元素,而对应的值是一个对象关联到这个键的内容。键映射值的类型可能会有所不同。
在内部unordered_map的元素不以键值或映射的元素作任何特定的顺序排序,其存储位置取决于哈希值允许直接通过其键值为快速访问单个元素(具有恒定平均的平均时间复杂度)。
unordered_map容器比map容器更快地通过键值访问他们的单个元素,虽然unordered_map一般都是比map通过其元素的一个子集范围迭代效率低。
哈希map允许使用操作运算符(运算符[])以其键值作为参数直接访问元素。

 

容器属性

关联

   在关联容器的元素通过键值引用,而不是由他们在容器中的绝对位置。

无序

    无序容器通过哈希表组织其元素的使用,允许通过键值快速访问其对应元素。

映射

     每个元素关联到一键值对应一映射值:键值用于识别元素,其主要内容是键对应的值。

唯一键

     在容器中没有两个元素可以有相同的

分配器的唤醒

     容器使用一个分配器对象动态地处理其存储需求。  

模板参数

Key

关键值的类型。一个unordered_map中的每个元素通过键值被唯一标识。

T

映射值的类型。 一个unordered_map中的每个元素是用来存储一些数据作为其映射值。别名为成员类型unordered_map:: mapped_type。请注意,这是和unordered_map:: value_type不同的(见下文)。

Hash


上文来自:http://blog.csdn.net/devourheavens/article/details/7539815


学习数据结构的时候 偶然得知有个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的方法

[cpp]  view plain copy
  1. "font-family:Microsoft YaHei;font-size:18px;">#ifndef CSESSION_H  
  2. #define CSESSION_H  
  3.   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   //头文件  
  9. #include   
  10.   
  11. using namespace std;  
  12. using namespace std::tr1;  
  13.   
  14. struct Terminal  
  15. {  
  16.     int             nid ; //id  the key for terminal  
  17.     sockaddr_in     addr; //ip  the key for Client  
  18.     time_t          tm;   //last alive time  
  19.     enTerminalStat  enStat;//status  
  20.     Terminal();  
  21.     ~Terminal();  
  22.     Terminal &operator =(const Terminal& term);  
  23. };  
  24.   
  25.   
  26. struct hash_func  //hash 函数  
  27. {  
  28.     size_t operator()(const sockaddr_in &addr) const  
  29.     {  
  30.          return addr.sin_port*9999 + addr.sin_addr.s_addr;  
  31.     }  
  32. };  
  33. struct cmp_fun //比较函数 ==  
  34. {  
  35.     bool operator()(const sockaddr_in &addr1, const sockaddr_in &addr2) const  
  36.     {  
  37.          return memcmp(&addr1, &addr2, sizeof(sockaddr_in)) == 0 ? true:false;  
  38.     }  
  39. };  
  40.   
  41. //typedef unordered_map MapTerminal; // Terminal socket 作为key  
  42. //typedef unordered_map::iterator MapTerminal_It; //  
  43.   
  44. typedef unordered_map MapClientSession; // sockaddr_in作为key  
  45. typedef unordered_map::iterator MapClientSession_It; //  
  46.   
  47.   
  48. #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==了。


上文来自:http://blog.csdn.NET/liuhongxiangm/article/details/17395831


你可能感兴趣的:(杂七杂八的)