STL map与Boost unordered_map - 有何不可的日志 - 网易博客

STL map与Boost unordered_map

2012-03-30 16:06:26|  分类:
c|c++
|  标签:

|字号 大中小 订阅


分类: C++2011-12-24 11:05 311人阅读 评论(0) 收藏 举报

今天看到 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。

其实,stl::map对于与java中的TreeMap,而boost::unordered_map对应于java中的HashMap。

stl::map

[cpp] view plaincopy

#include<string>  
#include<iostream>  
#include<map>  
  
using namespace std;  
  
struct person  
{  
    string name;  
    int age;  
  
    person(string name, int age)  
    {  
        this->name =  name;  
        this->age = age;  
    }  
  
    bool operator < (const person& p) const  
    {  
        return this->age < p.age;  
    }  
};  
  
map<person,int> m;  
int main()  
{  
    person p1("Tom1",20);  
    person p2("Tom2",22);  
    person p3("Tom3",22);  
    person p4("Tom4",23);  
    person p5("Tom5",24);  
    m.insert(make_pair(p3, 100));  
    m.insert(make_pair(p4, 100));  
    m.insert(make_pair(p5, 100));  
    m.insert(make_pair(p1, 100));  
    m.insert(make_pair(p2, 100));  
      
    for(map<person, int>::iterator iter = m.begin(); iter != m.end(); iter++)  
    {  
        cout<<iter->first.name<<"\t"<<iter->first.age<<endl;  
    }  
      
    return 0;  
}

output:

Tom1    20
Tom3    22
Tom4    23
Tom5    24

operator<的重载一定要定义成const。因为map内部实现时调用operator<的函数好像是const。

由于operator<比较的只是age,所以因为Tom2和Tom3的age相同,所以最终结果里面只有Tom3,没有Tom2

boost::unordered_map

[cpp] view plaincopy

#include<string>  
#include<iostream>  
  
#include<boost/unordered_map.hpp>  
  
using namespace std;  
  
struct person  
{  
    string name;  
    int age;  
  
    person(string name, int age)  
    {  
        this->name =  name;  
        this->age = age;  
    }  
  
    bool operator== (const person& p) const  
    {  
        return name==p.name && age==p.age;  
    }  
};  
  
size_t hash_value(const person& p)  
{  
    size_t seed = 0;  
    boost::hash_combine(seed, boost::hash_value(p.name));  
    boost::hash_combine(seed, boost::hash_value(p.age));  
    return seed;  
}  
  
int main()  
{  
    typedef boost::unordered_map<person,int> umap;  
    umap m;  
    person p1("Tom1",20);  
    person p2("Tom2",22);  
    person p3("Tom3",22);  
    person p4("Tom4",23);  
    person p5("Tom5",24);  
    m.insert(umap::value_type(p3, 100));  
    m.insert(umap::value_type(p4, 100));  
    m.insert(umap::value_type(p5, 100));  
    m.insert(umap::value_type(p1, 100));  
    m.insert(umap::value_type(p2, 100));  
      
    for(umap::iterator iter = m.begin(); iter != m.end(); iter++)  
    {  
        cout<<iter->first.name<<"\t"<<iter->first.age<<endl;  
    }  
      
    return 0;  
}  
输出

Tom1    20
Tom5    24
Tom4    23
Tom2    22
Tom3    22

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

STL map与Boost unordered_map - 有何不可的日志 - 网易博客相关推荐

  1. 将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客

    将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客 将socket设置为非阻塞(non-blocking) 2011-02-17 22:36:51|  分类: 默认分 ...

  2. 【错误】expected constructor, destructor, or type conversion before '.' token - 第八个游侠的日志 - 网易博客...

    [错误]expected constructor, destructor, or type conversion before '.' token - 第八个游侠的日志 - 网易博客 [错误]expe ...

  3. 关于PYTHON里SUPER使用时报的typeerror错误 - dongua的日志 - 网易博客

    关于PYTHON里SUPER使用时报的typeerror错误 - dongua的日志 - 网易博客 关于PYTHON里SUPER使用时报的typeerror错误 2009-08-25 17:16:08 ...

  4. RDP(Reliable--UDP)Library--可靠UDP传输实现方案 - 缘分天空的日志 - 网易博客

    温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博>  |  关闭 思想的小鱼 非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解 2011-07 ...

  5. Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客

    Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客 Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客 Org-mode五分钟教程ZZZ poste ...

  6. linux 静态链接 mysql glibc 库的悲催过程 - mango的日志 - 网易博客

    linux 静态链接 mysql glibc 库的悲催过程 - mango的日志 - 网易博客 linux 静态链接 mysql glibc 库的悲催过程 - mango的日志 - 网易博客 linu ...

  7. 【绿茶书情】:《SOHO小报》和《凤… - 绿茶的日志 - 网易博客

    [绿茶书情]:<SOHO小报>和<凤- - 绿茶的日志 - 网易博客 [绿茶书情]:<SOHO小报>和<凤-

  8. 冷却塔直纹面的matlab,直纹面 - calculus的日志 - 网易博客

    this.p={ m:2, b:2, loftPermalink:'', id:'fks_085074083084085075081084094095086083080064085095087069' ...

  9. matlab中绘制牟合方盖,牟合方盖 - calculus的日志 - 网易博客

    this.p={ m:2, b:2, loftPermalink:'', id:'fks_082075080094080075084087080095086083080064085095087069' ...

最新文章

  1. 【Android 内存优化】自定义组件长图组件 ( 自定义组件构造方法 )
  2. 利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖
  3. 区块链新一代监管框架 ---《STRISA 一种实施旅行规则的新架构》
  4. arcgis导入excel数据_ArcGIS批量导入数据
  5. springmvc学习(一)
  6. cserialport 循环发送信号_C++信号处理
  7. 二维码提升对比度文献调研(5)--DeepLPF: Deep Local Parametric Filters for Image Enhancement
  8. HDU1561 The more, The Better(树形dp)
  9. GitHub 近两万 Star,无需编码,可一键生成前后端代码
  10. 网吧游戏更新对比软件技术报告
  11. node用express写后端restful接口实战三:sequelize操作数据库:模型(Model)、迁移(Migration)与种子(Seeders)
  12. 优秀景区小程序开发案例赏析
  13. java并查集判断是否是连通图_并查集-判断图的连通
  14. 本科大专年限算工龄吗
  15. 河北正定县领导为参加世博会的常山战鼓队送行
  16. 输入一个字符串并判断英文字母个数、中文字母个数
  17. 游戏玩家到程序员的蜕变
  18. 开源蓝牙协议栈-Zephyr_polling简介
  19. python怎么输入分数_python怎么输出分数形式
  20. form表单判断是否为空——JavaWeb

热门文章

  1. dataguard备库的数据文件的迁移
  2. 使用代码为TextView设置drawableLeft
  3. poj 1511 Invitation Cards
  4. Golang Web入门(4):如何设计API
  5. ceph基本架构及数据分布原理
  6. ZooKeeper(一)linux上单机与集群的搭建
  7. React 第十二章 React思想
  8. C语言文件指针的基本函数介绍包含了fpoen、fclose、fgetc、fputc、fscanf、fprintf、fgets、fputs、fread、fwrite函数以及文件定位函数.
  9. threadlocal的set()方法中的内存回收
  10. 第二章--电商项目DB规划