(转载)STL map与Boost unordered_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。原因在于
- 运行效率方面:unordered_map最高,而map效率较低但 提供了稳定效率和有序的序列。
- 占用内存方面:map内存占用略低,unordered_map内存占用略高,而且是线性成比例的。
其实,stl::map对于与Java中的TreeMap,而boost::unordered_map对应于java中的HashMap。
stl::map
#include<bits/stdc++.h>
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", );
person p2("Tom2", );
person p3("Tom3", );
person p4("Tom4", );
person p5("Tom5", );
m.insert(make_pair(p3, ));
m.insert(make_pair(p4, ));
m.insert(make_pair(p5, ));
m.insert(make_pair(p1, ));
m.insert(make_pair(p2, )); for(map<person, int>::iterator iter = m.begin(); iter != m.end(); iter++)
{
cout << iter->first.name << "\t" << iter->first.age << endl;
} return ;
} Output:
Tom1
Tom3
Tom4
Tom5
由于operator<比较的只是age,所以因为Tom2和Tom3的age相同,所以最终结果里面只有Tom3,没有Tom2
#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 = ;
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",);
person p2("Tom2",);
person p3("Tom3",);
person p4("Tom4",);
person p5("Tom5",);
m.insert(umap::value_type(p3, ));
m.insert(umap::value_type(p4, ));
m.insert(umap::value_type(p5, ));
m.insert(umap::value_type(p1, ));
m.insert(umap::value_type(p2, )); for(umap::iterator iter = m.begin(); iter != m.end(); iter++)
{
cout<<iter->first.name<<"\t"<<iter->first.age<<endl;
} return ;
} Output:
Tom1
Tom5
Tom4
Tom2
Tom3
(转载)STL map与Boost unordered_map的比较的更多相关文章
- STL中stack/queue/map以及Boost unordered_map 的使用方法
一.stackstack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型 ...
- [转载]STL map中的一些基本函数
来源:(http://blog.sina.com.cn/s/blog_61533c9b0100fa7w.html) - C++ map的基本操作和使用_Live_新浪博客 Map是c++的一个标准容器 ...
- STL ——map、set、unordered_map、unordered_set
1.map和set map和set底层实现均是红黑树 map支持下标操作,set不支持下标操作. set的迭代器是const的,不允许修改元素的值:map允许修改value,但不允许修改key. se ...
- 关于c++ STL map 和 unordered_map 的效率的对比测试
本文采用在随机读取和插入的情况下测试map和unordered_map的效率 笔者的电脑是台渣机,现给出配置信息 处理器 : Intel Pentium(R) CPU G850 @ 2.90GHz × ...
- STL MAP及字典树在关键字统计中的性能分析
转载请注明出处:http://blog.csdn.net/mxway/article/details/21321541 在搜索引擎在通常会对关键字出现的次数进行统计,这篇文章分析下使用C++ STL中 ...
- POJ 3096 Surprising Strings(STL map string set vector)
题目:http://poj.org/problem?id=3096 题意:给定一个字符串S,从中找出所有有两个字符组成的子串,每当组成子串的字符之间隔着n字符时,如果没有相同的子串出现,则输出 &qu ...
- STL map 简介
STL map 简介 转载于:http://www.cnblogs.com/TianFang/archive/2006/12/30/607859.html 1.目录 map简介 map的功能 使用ma ...
- stl::map之const函数访问
如何在const成员数中访问stl::map呢?例如如下代码: string ConfigFileManager::MapQueryItem(const string& name) const ...
- hdu4941 Magical Forest (stl map)
2014多校7最水的题 Magical Forest Magical Forest Time Limit: 24000/12000 MS (Java/Others) Memory Limit ...
随机推荐
- Djaon 基于 Ajax 的 json 数据传输
关键参数:contentType:"application/json" data:JSON.stringify({ json数据 }) 再views.py中,使用request.d ...
- Dynamic Mapping和常见字段类型
原文:Dynamic Mapping和常见字段类型 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn. ...
- asp.net webapi自定义输出结果类似Response.Write()
asp.net webapi自定义输出结果类似Response.Write() [HttpGet] public HttpResponseMessage HelloWorld() { string ...
- OGG replicat复制进程的拆分
参考资料: 1.https://blog.csdn.net/datingting1/article/details/79583690
- shell 操作mysql
1.连接 #!/bin/bash user="root" password="XXXXXX" sql = `mysql -u>/dev/null use ...
- Vue的自定义滚动,我用el-scrollbar
弄了一个持续更新的github笔记,可以去看看,诚意之作(本来就是写给自己看的--)链接地址:Front-End-Basics 此篇文章的地址:Vue的自定义滚动,我用el-scrollbar 基础笔 ...
- Python---基础---list(列表)
2019-05-20 一. # append() 向列表末尾追加新元素 返回值Nonelist1 = [1,2,3,4,5]print(id(list1))list1.append(6)prin ...
- [BZOJ] 地精部落
问题描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H 可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中 Hi ...
- dijkstra求最小环
任意一个环的权值,我们都可以看成两个有边相连的结点i.j的直接距离加上i.j间不包含边(边i->j)的最短路径. 求最短路径我们第一个想到的就是Dijkstra算法. 而Dijkstra所求的是 ...
- luogu P1020 导弹拦截 x
首先上题目~ luogu P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都 ...