C++11 新特性: unordered_map 与 map 的对比
unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序,
存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。
所以使用时map的key需要定义operator<。而unordered_map需要定义hash_value函数并且重载operator==。但是很多系统内置的数据类型都自带这些,
那么如果是自定义类型,那么就需要自己重载operator<或者hash_value()了。
结论:如果需要内部元素自动排序,使用map,不需要排序使用unordered_map
map使用案例:
- #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",);
- 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 ;
- }
输出为:(根据age进行了排序的结果)
Tom1 20
Tom3 22
Tom4 23
Tom5 24
因为Tom2和Tom3的age相同,由我们定义的operator<只是比较的age,所以Tom3覆盖了Tom2,结果中没有Tom2。
如果运算符<的重载是如下
- bool operator < (const person &p)const{
- return this->name < p.name;
- }
输出结果: 按照 那么进行的排序,如果有那么相同则原来的那么会被覆盖
Tom1 20
Tom2 22
Tom3 22
Tom4 23
Tom5 24
unordered_map使用案例:
- #include<string>
- #include<iostream>
- #include<unordered_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 name==p.name && age==p.age;
- }
- };
- size_t hash_value(const person& p)
- {
- size_t seed = ;
- std::hash_combine(seed, std::hash_value(p.name));
- std::hash_combine(seed, std::hash_value(p.age));
- return seed;
- }
- int main()
- {
- typedef std::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 ;
- }
对于hash_value的重载没有成功,在vs2013上报错。
C++11 新特性: unordered_map 与 map 的对比的更多相关文章
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- C++11新特性——大括号初始化
C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello" ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- C++ 11 新特性
C++11新特性: 1.auto 2.nullptr 3.for 4.lambda表达式 5.override ...
- C++11新特性——range for
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中.range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作. 1.基本语法 for(d ...
- C++11新特性之六——元编程
C++11新特性之六——元编程
- C++11新特性之一——Lambda表达式
C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...
随机推荐
- 策略模式 - Strategy
Strategy Pattern,定义算法家族,分别封装起来,互相之间可替换,此模式让算法的变化不会影响到使用算法的客户端. // 上下文类(Context):用一个ConcreteStratege来 ...
- (1-2)配置的升级 - ASP.NET从MVC5升级到MVC6
ASP.NET从MVC5升级到MVC6 总目录 MVC5和MVC6的区别 在MVC5的时候,web.config文件无疑是整个配置的核心,从web配置,到应用程序的参数,都可以写在web.config ...
- php图片验证码为什么必须加上ob_clean();才能正常显示。
ob_clean这个函数的作用就是用来丢弃输出缓冲区中的内容,如果你的网站有许多生成的图片类文件,那么想要访问正确,就要经常清除缓冲区. If you work on an extremely lar ...
- table中设置border的问题
今天在修改table样式的时,想给tr加个border-bottom,一开始用的颜色比较浅,我还以为看电脑太久眼花,结果换了比较深的颜色后,border-bottom真的没有出来. 忽然想起在ht ...
- 学习.NET是因为热爱 or 兴趣 or 挣钱?
看到最近园子里掀起了“.NET快不行了”.“.NET工资太低了”.“转行做XX”等一系列之风,不由得想说点什么,我只是基于自己的观点,你认同或者不认同,我就是这样认为,无所谓对与错,写文章就是为了交流 ...
- OData V4 学习目录
开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准. Open Data Protocol (开放数据协议,OData)是用 ...
- 像素与rem转换
// rem尺寸转换函数开始(function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orienta ...
- “.”(十六进制值 0x00)是无效的字符解决方案
自从我们的项目数据层从读取数据库改为读取接口服务后,经常会出现一些类似于的错误.我们的数据结构如下所示 <type><![CDATA[gp]]></type> &l ...
- iOS下Audio自动播放(Autoplay)音乐
前几天做了一个H5活动页面,产品要求初始化播放音乐,因晓得H5 Audio标签支持Autoplay就没在意. 完了在手机上测试,发现手机上打开页面死活就是不会自动播放,点击播放按钮才可以播放,很是纠结 ...
- iOS适配 旧项目工程在iOS9下不能正常显示
在iOS开发中,很多时候会用到旧项目,比如版本的升级.使用Demo等等, iOS SDK正在不断的升级,不断的升级给iOS开发带来了新的活力. 然而在iOS SDK新的版本出来之后,旧项目可能会出现新 ...