unordered_map 简介
简介
无序映射(Unordered maps)是用于存储键值和映射值组合成的元素的关联容器,并允许基于其键快速检索各个元素。在unordered_map
中,键值通常用于唯一地标识元素,而映射值是具有与该键关联的内容的对象。键的类型和映射的值可能会有所不同。
头文件
在使用unordered_map
时,需要引入头文件:
#include < unordered_map >
内部实现
unordered_map
内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。
与map对比
map
优点:
有序性,这是
map
结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作;红黑树,内部实现一个红黑树使得
map
的很多操作在O(lgn)的时间复杂度下就可以实现,因此效率非常的高。
缺点:空间占用率高,因为
map
内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间应用场景:对于那些有顺序要求的问题,用
map
会更高效一些
unordered_map
- 优点:因为内部实现了哈希表,因此其查找速度非常的快
- 缺点:哈希表的建立比较耗费时间
- 应用场景:对于查找问题,
unordered_map
会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map
总结
- 内存占有率的问题就转化成红黑树 VS Hash表,还是
unordered_map
占用的内存要高; - 但是
unordered_map
执行效率要比map
高很多; - 对于
unordered_map
或unordered_set
容器,其遍历顺序与创建该容器时输入的顺序不一定相同,因为遍历是按照哈希表从前往后依次遍历的。
unordered_map的使用
unordered_map
的用法和map
是一样的,提供了 insert
,size
,count
等操作,并且里面的元素也是以pair类型来存贮的。其底层实现是完全不同的,上方已经解释了,但是就外部使用来说却是一致的。
#include <iostream>
#include <unordered_map>
#include <map>
#include <string>
using namespace std;
int main()
{ //注意:C++11才开始支持括号初始化unordered_map<int, string> myMap={{ 5, "张大" },{ 6, "李五" }};//使用{}赋值myMap[2] = "李四"; //使用[ ]进行单个插入,若已存在键值2,则赋值修改,若无则插入。myMap.insert(pair<int, string>(3, "陈二"));//使用insert和pair插入//遍历输出+迭代器的使用auto iter = myMap.begin();//auto自动识别为迭代器类型unordered_map<int,string>::iteratorwhile (iter!= myMap.end()){ cout << iter->first << "," << iter->second << endl; ++iter; } //查找元素并输出+迭代器的使用auto iterator = myMap.find(2);//find()返回一个指向2的迭代器if (iterator != myMap.end())cout << endl<< iterator->first << "," << iterator->second << endl; system("pause"); return 0;
}
练习
236. 二叉树的最近公共祖先
方法二:存储父节点
思路
我们可以用哈希表存储所有节点的父节点,然后我们就可以利用节点的父节点信息从 p
结点开始不断往上跳,并记录已经访问过的节点,再从 q
节点开始不断往上跳,如果碰到已经访问过的节点,那么这个节点就是我们要找的最近公共祖先。
算法
从根节点开始遍历整棵二叉树,用哈希表记录每个节点的父节点指针。
从
p
节点开始不断往它的祖先移动,并用数据结构记录已经访问过的祖先节点。同样,我们再从
q
节点开始不断往它的祖先移动,如果有祖先已经被访问过,即意味着这是p
和q
的深度最深的公共祖先,即 LCA 节点。
class Solution {public:unordered_map<int, TreeNode*> fa;unordered_map<int, bool> vis;void dfs(TreeNode* root){if (root->left != nullptr) {fa[root->left->val] = root;dfs(root->left);}if (root->right != nullptr) {fa[root->right->val] = root;dfs(root->right);}}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {fa[root->val] = nullptr;dfs(root);while (p != nullptr) {vis[p->val] = true;p = fa[p->val];}while (q != nullptr) {if (vis[q->val]) return q;q = fa[q->val];}return nullptr;}
};作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/er-cha-shu-de-zui-jin-gong-gong-zu-xian-by-leetc-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
参考资料
[1] map和unordered_map的差别和使用
[2] Unordered Map - C++ Reference
[3] 二叉树的最近公共祖先 - 力扣(LeetCode)
unordered_map 简介相关推荐
- set/multiset/unordered_set和map/multimap/unordered_map基础汇总
引言 在STL中,有两种很常见的关联容器,分别是set和map,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的.所以关联容器经常用在关键字的查找中,效 ...
- C++ unordered_map 使用详解(含C++20新特性)
目录 查找元素 迭代器 容量 修改操作 通接口 哈希策略 观察器 std::swap(std::unordered_map) std::erase_if (std::unordered_map) 简介 ...
- c++中map、multimap、unordered_map、unordered_multimap的区别
前言: c++的各种容器使用的时候很方便,但是如果作为一个初学者,看到一堆库要记住也是很头疼的,而且很多库名称会很相似,所以我们要很好的使用这些库的时候,我们需要了解清楚它们底层实现的原理,这样我们使 ...
- 每日一题 11.4 鸡蛋掉落
每日一题 11.4 鸡蛋掉落 一.题目概述 这是一道困难题,难度肯定是比前三天的要大的,这个毋庸置疑,但是毕竟趣味性在这里摆着,和昨天那个相比,钻研这个的兴趣要更大一点,昨天那个并查集和哈希表实在是太 ...
- map,multimap,unordered_map,unordered_multimap的详解
1,map简介 map是STL的一个关联容器,它提供一对一的hash. 第一个可以称为关键字(key),每个关键字只能在map中出现一次: 第二个可能称为该关键字的值(value): map以模板(泛 ...
- c++的STL中的map(哈希表)与unordered_map
map: unordered_map: map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的 unordered_map:unordered_map内部实 ...
- C++ Boost库:简介和第一个示例程序
文章目录 1. 简介 2. Boost库开发环境搭建 3. 一个简单的示例程序 4. hpp文件简介 C++ Boost库:简介和第一个示例程序 C++ Boost库:数值转换 lexical_cas ...
- C++ STL标准模板库简介
文章目录 1. 什么是STL? 2. STL的优势 3. STL版本? 4. STL的六大组件 5. 学习建议 6. 为什么需要迭代器? 7. 自己实现迭代器iterator 8. STL中的5种迭代 ...
- C++中的unordered_map用法详解
1 简介 unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value. key值应该是唯一的,key和value的数据类型可以不相同. uno ...
- STL教程(十): 关联容器--unordered_map/unordered_multimap
一.unordered_map/unordered_multimap简介 template<class Key,class T,class Hash = std::hash<Key> ...
最新文章
- 吴恩达机器学习笔记:(三)梯度下降法
- [01-01]oracle数据库汉化
- 四十二、深入Java中的文件读取操作
- 行走在成为程序猿的道路上
- 【CentOS】安装部署jenkins从git获取代码[转]
- 学JS的心路历程-Promise(一)
- 90后实习生,是如何成长为阿里云分布式NoSQL领域专家
- 解决thrift: ···No such file or directory问题
- 7、监控和管理Linux进程
- 2017年7月19日晚作业
- css集合——好看的按钮样式+阴影+渐变
- 计算机感染病毒后 一定不能清除的措施是,货物周转量比上年同期下降最多的是()。...
- 斗图?教你用Python制作表情包
- 杨百翰大学 排名Brigham Young University,入学要求,申请条件,简介_施强留学网...
- 基于Atmel128A单片机的MP31.0设计
- 尚硅谷 clickHouse
- 前端课程设计02-购物商城
- 阿里云的PolarDB要开源了?这个数据库到底强在哪?
- 快速原型模型(Rapid Prototype Model)
- 考研计算机最低分数,考研最低录取分数线是多少
热门文章
- pyglet: a cross-platform windowing and multimedia
- javascript自动填写表单小技巧
- 世界完全对称日计算(C++)
- 12步让你的web1.0变成web2.0
- Spring Cloud - Nacos 注册中心入门单机模式及集群模式
- Map使用put进行数据的添加,对哈希表的三步添加的步骤
- Java、Python网页项目,纯前端项目,无后端参考代码,谨慎下载,全网可视性超强Web项目,免费源码,Js、Html、Css组合网页,可衔接数据库,数据可自行修改,可使用SSM、SpringBoo
- 实验一matlab编程基础,实验一、MATLAB编程基础及典型实例.doc
- 台式电脑计算机图标打不开怎么办,电脑计算机图标打不开怎么办
- 无锡php公司,start.php