简介

无序映射(Unordered maps)是用于存储键值映射值组合成的元素的关联容器,并允许基于其键快速检索各个元素。在unordered_map中,键值通常用于唯一地标识元素,而映射值是具有与该键关联的内容的对象。键的类型和映射的值可能会有所不同。

头文件

在使用unordered_map时,需要引入头文件:

#include < unordered_map >

内部实现

unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。

与map对比

map

  1. 优点:

    • 有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作;

    • 红黑树,内部实现一个红黑树使得map的很多操作在O(lgn)的时间复杂度下就可以实现,因此效率非常的高。

  2. 缺点:空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间

  3. 应用场景:对于那些有顺序要求的问题,用map会更高效一些

unordered_map

  1. 优点:因为内部实现了哈希表,因此其查找速度非常的快
  2. 缺点:哈希表的建立比较耗费时间
  3. 应用场景:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

总结

  1. 内存占有率的问题就转化成红黑树 VS Hash表,还是unordered_map占用的内存要高;
  2. 但是unordered_map执行效率要比map高很多;
  3. 对于unordered_mapunordered_set容器,其遍历顺序与创建该容器时输入的顺序不一定相同,因为遍历是按照哈希表从前往后依次遍历的。

unordered_map的使用

unordered_map的用法和map是一样的,提供了 insertsizecount等操作,并且里面的元素也是以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 节点开始不断往上跳,如果碰到已经访问过的节点,那么这个节点就是我们要找的最近公共祖先。

算法

  1. 从根节点开始遍历整棵二叉树,用哈希表记录每个节点的父节点指针。

  2. p 节点开始不断往它的祖先移动,并用数据结构记录已经访问过的祖先节点。

  3. 同样,我们再从 q 节点开始不断往它的祖先移动,如果有祖先已经被访问过,即意味着这是 pq 的深度最深的公共祖先,即 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 简介相关推荐

  1. set/multiset/unordered_set和map/multimap/unordered_map基础汇总

    引言 在STL中,有两种很常见的关联容器,分别是set和map,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的.所以关联容器经常用在关键字的查找中,效 ...

  2. C++ unordered_map 使用详解(含C++20新特性)

    目录 查找元素 迭代器 容量 修改操作 通接口 哈希策略 观察器 std::swap(std::unordered_map) std::erase_if (std::unordered_map) 简介 ...

  3. c++中map、multimap、unordered_map、unordered_multimap的区别

    前言: c++的各种容器使用的时候很方便,但是如果作为一个初学者,看到一堆库要记住也是很头疼的,而且很多库名称会很相似,所以我们要很好的使用这些库的时候,我们需要了解清楚它们底层实现的原理,这样我们使 ...

  4. 每日一题 11.4 鸡蛋掉落

    每日一题 11.4 鸡蛋掉落 一.题目概述 这是一道困难题,难度肯定是比前三天的要大的,这个毋庸置疑,但是毕竟趣味性在这里摆着,和昨天那个相比,钻研这个的兴趣要更大一点,昨天那个并查集和哈希表实在是太 ...

  5. map,multimap,unordered_map,unordered_multimap的详解

    1,map简介 map是STL的一个关联容器,它提供一对一的hash. 第一个可以称为关键字(key),每个关键字只能在map中出现一次: 第二个可能称为该关键字的值(value): map以模板(泛 ...

  6. c++的STL中的map(哈希表)与unordered_map

    map: unordered_map: map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的 unordered_map:unordered_map内部实 ...

  7. C++ Boost库:简介和第一个示例程序

    文章目录 1. 简介 2. Boost库开发环境搭建 3. 一个简单的示例程序 4. hpp文件简介 C++ Boost库:简介和第一个示例程序 C++ Boost库:数值转换 lexical_cas ...

  8. C++ STL标准模板库简介

    文章目录 1. 什么是STL? 2. STL的优势 3. STL版本? 4. STL的六大组件 5. 学习建议 6. 为什么需要迭代器? 7. 自己实现迭代器iterator 8. STL中的5种迭代 ...

  9. C++中的unordered_map用法详解

    1 简介 unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value. key值应该是唯一的,key和value的数据类型可以不相同. uno ...

  10. STL教程(十): 关联容器--unordered_map/unordered_multimap

    一.unordered_map/unordered_multimap简介 template<class Key,class T,class Hash = std::hash<Key> ...

最新文章

  1. 吴恩达机器学习笔记:(三)梯度下降法
  2. [01-01]oracle数据库汉化
  3. 四十二、深入Java中的文件读取操作
  4. 行走在成为程序猿的道路上
  5. 【CentOS】安装部署jenkins从git获取代码[转]
  6. 学JS的心路历程-Promise(一)
  7. 90后实习生,是如何成长为阿里云分布式NoSQL领域专家
  8. 解决thrift: ···No such file or directory问题
  9. 7、监控和管理Linux进程
  10. 2017年7月19日晚作业
  11. css集合——好看的按钮样式+阴影+渐变
  12. 计算机感染病毒后 一定不能清除的措施是,货物周转量比上年同期下降最多的是()。...
  13. 斗图?教你用Python制作表情包
  14. 杨百翰大学 排名Brigham Young University,入学要求,申请条件,简介_施强留学网...
  15. 基于Atmel128A单片机的MP31.0设计
  16. 尚硅谷 clickHouse
  17. 前端课程设计02-购物商城
  18. 阿里云的PolarDB要开源了?这个数据库到底强在哪?
  19. 快速原型模型(Rapid Prototype Model)
  20. 考研计算机最低分数,考研最低录取分数线是多少

热门文章

  1. pyglet: a cross-platform windowing and multimedia
  2. javascript自动填写表单小技巧
  3. 世界完全对称日计算(C++)
  4. 12步让你的web1.0变成web2.0
  5. Spring Cloud - Nacos 注册中心入门单机模式及集群模式
  6. Map使用put进行数据的添加,对哈希表的三步添加的步骤
  7. Java、Python网页项目,纯前端项目,无后端参考代码,谨慎下载,全网可视性超强Web项目,免费源码,Js、Html、Css组合网页,可衔接数据库,数据可自行修改,可使用SSM、SpringBoo
  8. 实验一matlab编程基础,实验一、MATLAB编程基础及典型实例.doc
  9. 台式电脑计算机图标打不开怎么办,电脑计算机图标打不开怎么办
  10. 无锡php公司,start.php