[TOC]

文章参考:https://www.w3cschool.cn/cpp/cpp-fu8l2ppt.html

文章参考:http://c.biancheng.net/view/7235.html

概述

map底层实现

C++ STL 标准库中,不仅是 unordered_map 容器,所有无序容器的底层实现都采用的是哈希表存储结构。更准确地说,是用“链地址法”(又称“开链法”)解决数据存储位置发生冲突的哈希表,整个存储结构如图 1 所示。

C++ STL 无序容器存储状态示意图

其中,Pi 表示存储的各个键值对。

可以看到,当使用无序容器存储键值对时,会先申请一整块连续的存储空间,但此空间并不用来直接存储键值对,而是存储各个链表的头指针,各键值对真正的存储位置是各个链表的节点。

map[]和map.at()取值之间的区别

文章参考:https://blog.csdn.net/guotianqing/article/details/108896065

文章参考:http://c.biancheng.net/view/7177.html

注意,aMap是map类的对象,通过aMap[key]取值和通过aMap.at(key)取值的区别如下:

aMap[key]如果key不存在会添加key,不会抛出异常;

aMap.at(key)会检查key,如果不存在会抛出异常。

本节所介绍的几种方法中,仅从“在 map 容器存储的键值对中,获取指定键对应的值”的角度出发,更推荐使用 at() 成员方法,因为该方法既简单又安全。