C++STL之unordered_map详解

【C++】unordered_set 容器的最全解析(什么是unordered_set?unordered_set的常用接口有那些?) 【unordered_set】是STL中的容器之一,不同于普通容器,它的查找速度极快,常用来存储各种经常被检索的数据,因为容器的底层是【哈希表】。除此之外,还可以借助其特殊的性质,解决部分难题。 阅读详情

C++ STL之unordered_map详解:从使用到底层,再到面试八股

本文面向面试和日常开发,先讲调用,再讲原理,最后给口语化面试答案。阅读前建议先看完 map详解,本文大量对比两者的差异。


一、用法速查

1.1 基本操作

#include <unordered_map>
unordered_map<string, int> mp;

// 插入
mp["apple"] = 1;                     // 下标
mp.insert({"banana", 2});            // 花括号
mp.emplace("cherry", 3);             // 原地构造

// 查找
auto it = mp.find("apple");          // 返回迭代器,未找到返回 end()
if (mp.count("apple")) { }           // 存在返回1
if (mp.contains("apple")) { }        // C++20

// 删除
mp.erase("apple");                   // 按键删除
mp.erase(it);                        // 按迭代器删除

// 遍历(无序!顺序与插入无关)
for (auto &[k, v] : mp)
    cout << k << " -> " << v << "\n";

1.2 常用函数速查

方法含义复杂度
mp[key]访问/插入,不存在则创建默认值O(1) 平均
mp.insert({k,v})插入O(1) 平均
mp.emplace(k,v)原地构造插入O(1) 平均
mp.find(key)查找O(1) 平均
mp.count/contains(key)判断存在O(1) 平均
mp.erase(key)删除O(1) 平均
mp.bucket_count()桶的数量O(1)
mp.load_factor()负载因子 = size/bucket_countO(1)
mp.max_load_factor()获取/设置最大负载因子O(1)
mp.rehash(n)设置桶数量至少为 nO(N)
mp.reserve(n)预留至少能存 n 个元素的空间O(N)

1.3 自定义哈希函数

struct Point { int x, y; };

// 方法1:自定义哈希仿函数
struct PointHash {
    size_t operator()(const Point &p) const {
        return hash<int>()(p.x) ^ (hash<int>()(p.y) << 1);
    }
};
// 别忘了还要定义相等比较
struct PointEqual {
    bool operator()(const Point &a, const Point &b) const {
        return a.x == b.x && a.y == b.y;
    }
};
unordered_map<Point, string, PointHash, PointEqual> mp;

// 方法2:特化 std::hash(全局生效)
namespace std {
    template<> struct hash<Point> {
        size_t operator()(const Point &p) const {
            return hash<int>()(p.x) ^ (hash<int>()(p.y) << 1);
        }
    };
}
// 还得定义 operator==
bool operator==(const Point &a, const Point &b) {
    return a.x == b.x && a.y == b.y;
}
// 现在可以直接用 unordered_map<Point, string>

方法 1 更安全——只影响当前容器。方法 2 全局生效,但你不需要每次都传哈希函数。


二、底层原理

2.1 哈希表:unordered_map 的底层数据结构

unordered_map 的底层是一个哈希表。具体来说,三大主流编译器都采用**链地址法(Separate Chaining)**来解决哈希冲突。

先看哈希表的整体结构:

┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │  ← 桶数组(bucket array)
└─┬─┴─┬─┴───┴─┬─┴───┴───┴───┴───┘
  │   │        │
  ▼   ▼        ▼
[node] [node]  [node] → [node]  ← 每个桶挂着一条链表(或单节点)
  K,V   K,V     K,V       K,V

一个元素存储的大致过程:

  1. 对 key 调用哈希函数,得到一个 size_t 值
  2. 用这个值对桶数量取模:index = hash(key) % bucket_count
  3. 把键值对挂到第 index 个桶的链表上

查找时同理:哈希 → 算桶号 → 在桶的那条链表里找。如果链表很短(理想情况),查找就是 O(1)。

2.2 负载因子与 rehash

上面说的"理想情况"有一个前提:链表不能太长。当元素越来越多、桶数量不变时,每个桶上挂的元素就会越来越多,链表越来越长,查找逐渐退化成 O(N)。

为了避免这种情况,unordered_map 维护了一个负载因子(load factor):

load_factor = size / bucket_count

当 load_factor > max_load_factor() 时(默认 max_load_factor 是 1.0),触发 rehash:

  1. 分配一个更大的桶数组(通常是原来的 2 倍)
  2. 把所有元素重新哈希,挂到新桶数组上
  3. 释放旧桶数组

整个过程是 O(N) 的——因为你必须重新哈希每一个元素。这就是为什么 unordered_map 的插入在绝大多数时候是 O(1),但偶尔会触发一次 O(N) 的 rehash。

这个 rehash 会带来一个严重的副作用:所有迭代器失效。 因为元素节点虽然没变,但桶数组换了一块内存,指向旧桶的迭代器全部变成野指针。

所以如果你需要边遍历边插入,unordered_map 做不到——或者说,做的话行为是未定义的。map 没有这个问题,因为红黑树插入新节点不影响已有节点。

2.3 reserve 和 rehash:你知道它们有区别吗?

很多人以为 reserve 和 rehash 是一样的,其实不是:

  • rehash(n):把桶数量(bucket_count)设置为 ≥ n。如果 n 小于当前桶数,可能缩小也可能不变,具体看实现。
  • reserve(n):保证至少能存储 n 个元素而不触发 rehash。内部会调用 rehash(ceil(n / max_load_factor()))。

如果你预知要插入多少元素,用 reserve 一次性预分配,避免多次 rehash:

unordered_map<int, string> mp;
mp.reserve(10000);  // 保证插入 10000 个以内不 rehash
for (int i = 0; i < 10000; i++)
    mp[i] = "value";  // 全部 O(1),无 rehash 抖动

如果不做 reserve,随着元素增长会触发多次 rehash(16→32→64→128…→8192→16384),每次 rehash 都是 O(N),累积起来性能就垮了。

2.4 哈希冲突的两种解决方案

主流编译器都选择了链地址法(Separate Chaining),但另一种方案**开放寻址法(Open Addressing)**也值得你了解,因为面试可能问到。

链地址法(gcc/clang/MSVC 使用):每个桶是一个链表的头指针。冲突时把新节点挂到链表末尾。优点是实现简单、删除方便、元素数量可以超过桶数量。缺点是链表节点分散在堆上,缓存局部性差——遍历时指针跳来跳去,CPU 缓存命中率低。

开放寻址法(如 absl::flat_hash_map、robin_hood 等高性能第三方库使用):所有元素存在桶数组内部,冲突时用探测序列(线性探测/二次探测/双重哈希)找到下一个空桶。优点是缓存友好——所有数据在连续内存上,遍历时 CPU 预取效率极高。缺点是删除复杂(不能直接清空,得设墓碑标记)、负载因子不能太高(通常设 0.5-0.7)。

面试时如果你能说出"STL 用链地址法,工业级高性能场景用开放寻址法、比如 Google 的 SwissTable",面试官会觉得你对这个领域有实际了解。

2.5 memcmp 比较的隐患(std::pair 作 key)

当我们用 unordered_map<pair<int,int>, string> 时,C++ 标准库并没有为 pair<int,int> 提供默认的哈希函数。它不像 int 或 string 那样有内置的特化。所以我们需要自己写哈希。

但是,即便你写了哈希,如果你对 pair 的相等比较不提供正确的 operator==,哈希表也会出错。因为哈希表通过哈希值来确定桶号,但同一桶内如果链表长度大于 1,最终确定是不是同一个 key,靠的是相等比较。

正确的做法是同时提供哈希和相等:

auto hash_pair = [](const pair<int,int> &p) {
    return hash<int>()(p.first) ^ (hash<int>()(p.second) << 1);
};
auto equal_pair = [](const pair<int,int> &a, const pair<int,int> &b) {
    return a.first == b.first && a.second == b.second;
};
unordered_map<pair<int,int>, string, decltype(hash_pair), decltype(equal_pair)> mp(8, hash_pair, equal_pair);

如果你忘了传相等比较函数,而 pair 本身默认有 operator==(C++ 标准库提供的),这种情况下不会出错——但并非所有自定义类型都有合理的 operator==。这是一个常见的疏忽点。

2.6 为什么遍历顺序跟插入顺序不一样?

这是 unordered_map 最容易让新手困惑的点。你按顺序插入 “apple"→"banana"→"cherry”,遍历出来的顺序是乱的无规律的,而且每次运行可能还不一样。

原因很简单:遍历的不是插入顺序,而是桶数组的顺序。遍历大概长这样:

for 桶号 from 0 to bucket_count - 1:
    for 该桶上的链表:
        输出节点

而一个元素落到哪个桶,完全由 hash(key) % bucket_count 决定——哈希值是伪随机的,桶号就是伪随机的。所以遍历顺序也是随机的。

如果你需要保持插入顺序,C++ 没有内置的 LinkedHashMap(Java 有)。需要自己组合 list + unordered_map,或者用第三方库(如 boost::multi_index)。


三、map vs unordered_map:一张表讲清楚

维度map(红黑树)unordered_map(哈希表)
底层结构红黑树哈希表(链地址法)
有序性按键升序无序(顺序不可预期)
查找O(logN),稳定O(1) 平均,O(N) 最坏(哈希冲突严重时)
插入O(logN),稳定O(1) 平均,偶尔 O(N) rehash
删除O(logN)O(1) 平均
内存每节点 ~40B(3指针+颜色+KV)桶数组 + 链表节点(≈每元素更大的常数)
迭代器失效(插入时)不失效rehash 时全部失效
范围查询支持(lower_bound/upper_bound)不支持
遍历顺序升序桶序
自定义 key 门槛需 operator<需哈希函数 + operator==
最小数据量100 以内可能比哈希表快哈希建表有小额开销

选择口诀:

  • 需要有序遍历或范围查询 → map
  • 纯查找,key 是 int/string 等内置类型 → unordered_map
  • 不知道存多少元素且要边遍历边插入 → map(迭代器不失效)
  • 数据量巨大且预知大小 → unordered_map + reserve(n)

2.7 负载因子:为什么默认是 1.0?

要理解为什么默认值是 1.0,先理解负载因子高了和低了分别意味着什么。

负载因子低(如 0.5):桶数组很大,每个桶平均只挂 0.5 个元素——大部分桶是空的,链表很短。查找很快(几乎每次都是 O(1)),但内存浪费严重。适合查找密集型场景。

负载因子高(如 2.0):桶数组较小,每个桶平均挂 2 个元素——链表稍长。内存利用率高,但查找需要遍历链表,性能略降。适合内存受限场景。

默认 1.0 是一个平衡点:内存开销和查找性能在大多数场景下都能接受。

你可以调整:

mp.max_load_factor(0.5);  // 降低负载因子,用内存换速度
mp.max_load_factor(2.0);  // 提高负载因子,用速度换内存

2.8 内存碎片:unordered_map 的隐藏成本

很多教程只看时间复杂度,但不看空间开销。unordered_map 除了桶数组(一块连续内存),每个节点的链表节点是分散在堆上的。如果你频繁插入删除,内存分配器会产生大量碎片。

相比之下,map 虽然每节点空间更大,但很多 map 的节点只涉及少数几种大小——红黑树节点的类型是固定的,分配器可以高效地管理这些固定大小的内存块。这也是 map 在某些测试场景下实际性能反超 unordered_map 的原因之一。

一个更优的选择是 absl::flat_hash_map(Google Abseil 库)——它用开放寻址法把所有元素存在连续内存里,避免了链表节点的碎片问题,缓存局部性也极好。如果你的项目对性能有极致要求,可以绕过 STL 直接用这些工业级实现。


四、面试题 + 口语化答案

Q1:unordered_map 底层是什么?怎么处理哈希冲突?

“哈希表,用链地址法解决冲突——每个桶是一条链表。冲突了就挂到链表上。STL 三大实现都是链地址法。工业级高性能哈希表(如 Google SwissTable)用开放寻址法。”

Q2:什么时候会 rehash?迭代器会怎样?

“当 size / bucket_count > max_load_factor()(默认 1.0)时触发 rehash。rehash 会分配更大的桶数组,重新哈希所有元素——所有迭代器在 rehash 后全部失效。因为桶数组换了一块内存。”

Q3:reserve 和 rehash 有什么区别?

“rehash(n) 设置桶数量 ≥n,reserve(n) 保证存 n 个元素不 rehash。reserve 更实用——你知道要插 10000 个元素,就 reserve(10000),避免多次 rehash。”

Q4:map 和 unordered_map 什么时候用哪个?

“需要有序遍历或范围查询用 map。纯查找用 unordered_map。但数据量小时(<100)map 可能更快——哈希建表有小额开销。还有,map 迭代器插入不失效,unordered_map rehash 时全失效。”

Q5:为什么 unordered_map 遍历顺序是乱的?

“因为遍历是按桶数组顺序走的,不是按插入顺序。元素落到哪个桶取决于 hash(key) % bucket_count——哈希值是伪随机的,所以遍历顺序也是随机的。”

Q6:怎么给自定义类型做 unordered_map 的 key?

“两步:写哈希函数(仿函数或特化 std::hash),写相等比较(operator== 或仿函数)。两者缺一不可。哈希决定桶号,相等比较决定桶内是不是同一个 key。”

Q7:负载因子设多少合适?

“默认 1.0 是个平衡点。需要更快查找到话设低一点(如 0.5),用内存换速度。内存紧张的话可以设高(如 2.0),用速度换内存。一般不需要调,除非你对场景很了解。”

Q8:unordered_map 能边遍历边删除吗?

“可以——用 it = mp.erase(it) 返回下一个有效迭代器的模式。但是不能边遍历边插入——插入可能触发 rehash,所有迭代器失效。这点和 map 不一样——map 边遍历边插入没问题。”


一句话总结:unordered_map 看起来只是 map 的"更快的版本",但 rehash 带来的迭代器失效、内存碎片、遍历无序——这三个坑才是理解它的关键。把 map 和 unordered_map 放在一起理解,别孤立地学。

【STL】关联容器之map用法总结         一、基本原理         map是C++标准库提供的关联容器之一,保存的是键值对(key-value),我们可以通过key快速查找到其对应的value。map底层使用的数据结构是红黑树,因此在map中查找、添加或删除元素时间复杂度都是O(log(n))。此外,map中的元素还是有序的。         map使用场景:       &nbs 阅读详情

相关推荐

C++——unordered_map浅析

1. 简介 从 C++ 11 开始,hash_map 实现已被添加到标准库中,但为了防止与已有的代码存在冲突,决定使用替代名称 unordered_map。这个名字其实更具描述性,因为说明了该类元素的无序性。 unordered_map记录元素的hash值,根据hash值判断元素是否相同 map相当于java中的TreeMap,unordered_map相当于HashMap 查找、插入效率:unordered_map的效率都优于hash_map,更优于map 空间复杂度:hash_map最低,unorde

Yawn 3418

C++中的unordered_map用法详解

1 简介 unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value。 key值应该是唯一的,key和value的数据类型可以不相同。 unordered_map存储元素时是没有顺序的,只是根据key的哈希值,将元素存在指定位置,所以根据key查找单个value时非常高效,平均可以在常数时间内完成。 unordered_map查询单个key的时候效率比map高,但是要查询某一范围内的key值时比map效率低。 可以使用[]操作符来访问key值对应的

zou_albert的博客 21万+

【C++】STL详解(十一)—— unordered_set、unordered_map的介绍及使用

今天我们比较详细地完成了 unordered_set、unordered_map的介绍及使用,了解了一些有关的底层原理。接下来,我们用哈希表封装出unordered_map和unordered_set。希望我的文章和讲解能对大家的学习提供一些帮助。

Sherry的博客 903

unordered_map详解和性能分析

std::unordered_map是C++标准库中的一个关联容器,它可以存储一组键值对,并且支持快速的查找、插入和删除操作。class Ty,std::hash是一个模板类,它接受一个类型参数T,用于指定需要哈希的对象类型。还提供了一个函数调用运算符(operator()),用于计算对象的哈希值。perator()接受一个常量引用key,用于指定需要计算哈希值的对象。它返回一个类型的哈希值,表示对象在哈希表中的桶位置。实现一个哈希函数。

上官宏竹的专栏 2万+

termux 安装 rockylinux

往找最新的文件目录,选择ARM版本的image。或者直接查看目录或者国内阿里云镜像,按照cpu架构(安卓9手机一般是aarch64arm最新架构),获取镜像地址,以及checksum里的SHA256信息更新到以下rocky9.sh脚本,如果不需要直接使用即可。

欢迎来到别往的博客 983

暗黑破坏神2重制版 mod制作教程(一)

暗黑2重制版mod修改教程

hhhh2312的博客 7449

C++ STL unordered_map详解

文章目录一、哈希表二、unordered_map 一、哈希表 unordered_map 容器,无序容器的底层实现都采用的是哈希表存储结构,python的字典也是如此。关于哈希表(散列表)可以查看:https://zhuanlan.zhihu.com/p/45430524 左边很明显是个数组,数组的每个成员包括一个指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。 当使用无序容器存储键值

红叶谷 wsp_1138886114的博客 4969

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1092

【STL】C++ STL之unordered_map详解

【C++】unordered_map 容器的最全解析(什么是unordered_map?unordered_map的常用接口有那些?

weixin_44595311的博客 675

海康威视门禁考勤设备数据对接实战:从被动推送到主动拉取

本文深入探讨了海康威视门禁考勤设备数据对接的两种核心方案:HTTP推送与SDK主动拉取。文章对比了两种方式的适用场景、技术实现与优缺点,为开发者提供了从设备配置、代码编写到工程化部署的完整实战指南,帮助读者根据项目规模、网络环境及数据稳定性要求,做出最合适的技术选型。

weixin_29284657的博客 666

Vofa+使用笔记(1):用Vofa+通过串口连接显示波形

1. 介绍 Vofa+有三种协议设置 rawdata:你发什么就显示什么,跟普通的串口助手一样 firewater:最简单在VOFA+里绘制波形的协议,建议仅在通道数量不多、发送频率不高的时候使用。 justfloat:有一定的数据格式,此协议非常适合用在通道数量多、发送频率高的时候。 2. 使用步骤 设置号下面三个地方,使用的协议以及传输的方式 拉出控件 (最开始上位机没有识别到你的数据的时候,右边是没有数据显示的,如果你想要y轴显示什么数据,右边设置显示也可以,右键波形图然后Y轴设置也行) 把进

苏释州的博客 5万+

C++ (STL)之unordered_map详解

本文介绍了unordered_map的实现与特性;常用接口函数及其作用;常用函数示例;应用方向与题型;以及常见坑,

多多爱学习 1887

JavaScript(JS)、ECMAScript(ES)和TypeScript(TS)

JavaScript、ECMAScript和TypeScript是现代Web开发中不可或缺的技术。它们各自具有独特的特点和优势,相互补充,共同推动着Web开发的发展。了解它们的概念、特点、应用场景和发展历程,有助于我们更好地掌握和使用这些技术,提高开发效率,实现更高质量和更可靠的Web应用。

u013558123的博客 1718

C++ STL Map/unordered_map详解

一、Map (1)map简介 maps是一个存储 &amp;amp;lt; key , value &amp;amp;gt;(键值-映射值)的关联容器,并且按key默认递增有序。这里特别注意map中的key不可重复,只能唯一。 (2)插入元素 使用STL中的容器肯定需要插入元素,所以我们尝试如何在map中插入元素。 在c++ 98中map的insert操作共有3种方式: single element (1) pair&amp;amp;lt;...

karry_zzj的博客 1220

MTK AWB 色温曲线的进一步猜想

平均距离来判断是否对该色温下白平衡进行全部收白处理,还是保留一些光源的本身的颜色。比如占据图像一大半左右的纯色背景,纵坐标值相对横坐标的距离应该会比较大,大于一般场景下的正常白点分布。反之,位于Plank_curve下方位置的点具有偏洋红色的倾向。此时拟合各个色温下的白点,拟合曲线大致是以X= 0.85)平行于横轴的一条直线。对原始坐标系中的点取对数后的Log坐标系空间。此时拟合各个色温下的白点,拟合曲线大致呈现的是一条直线。,可以认为是各种色温下白点分布所呈现的走向。的算法利用某个色温点的偏离。

大熊 721

zemax 如何编译用户自定义DLL(含VS下载教程)

zemax 如何编译用户自定义DLL(含VS下载教程)

weixin_72050316的博客 491

C++总结(7):STL无序容器之unordered_set、unordered_map、unordered_multiset、unordered_multimap详解

前两节介绍了STL中的和,本节来介绍一下无序容器。无序容器与关联容器类似,但是关联容器是顺序排序的,而无序容器实现了未排序(哈希)的数据结构。

主要分享嵌入式软件、人工智能部分知识 5万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++ STL unordered_map容器用法详解

C++ STL 标准库中提供有 4 种无序关联式容器,本节先讲解 unordered_map 容器。unordered_map 容器,直译过来就是"无序 map 容器"的意思。所谓“无序”,指的是 unordered_map 容器不会像 map 容器那样对存储的数据进行排序。换句话说,unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。

weixin_51710308的博客 3449

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【C++】:STL详解 —— unordered_set 和 unordered_map类

unordered_set 是 C++ 标准库中的一个容器,用于存储唯一元素,基于哈希表实现 1. 基本特性 唯一性:元素唯一,不允许重复。 无序性:元素不按特定顺序存储,遍历顺序不确定。 基于哈希表:通过哈希函数将元素映射到桶(bucket)中,提供平均 O(1) 的查找、插入和删除操作(最坏情况 O(n))。 2. 实现原理 哈希函数:每个元素通过哈希函数计算哈希值,决定其存储的桶位置。 冲突处理:通常采用链地址法(每个桶内用链表管理冲突元素)。 动态扩容:当负载因子(元素数 / 桶数)

元清的博客 1513

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【c++】STL 容器 unordered_map用法详解

这里对unordered_map进行一些简单的介绍,包括其基本用法。更加详细的介绍请学习cplusplus网站相关资料。1 一、定义 template < class Key, // unordered_map::key_type class T, ...

最简示例破局!基础用法秒会,深层原理不绕弯。 1万+

c++ map是有序还是无序的_C++STL : unordered_map详解

转载详细介绍C++STL:unordered_map - 追逐梦想的苦行僧 - 博客园​www.cnblogs.com尝试联系文章作者,但是联系不上了。(侵删)加入了自己的一点解释和理解。C++ 11标准中加入了unordered系列的容器。unordered_map记录元素的hash值,根据hash值判断元素是否相同。map相当于java中的TreeMap,unordered_map相当于Has...

weixin_36392230的博客 2532

C++ STL库map,unordered_map,multimap,unordered_multimap详解

本文摘要:文章系统介绍了C++ STL中的关联容器,重点分析map、unordered_map及其变体multimap的特性与使用。map基于红黑树实现,保持元素有序性,提供O(logn)操作复杂度;unordered_map基于哈希表,提供平均O(1)访问但无序存储。详细对比了两者在构造、访问、查找、删除等方面的差异,并介绍了multimap允许重复键的特性。

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 821

C++STL之map和unordered_map详解

前面的STL的容器,如vector、list、deque等都是,因为(1)底层的数据结构是线性的(2)存储的是元素本身(3)数据和数据之间没有关联也是用来存储数据的, 不过里面存储的是键值对,数据检索时,效率比序列式容器高。STL有两种关联式容器:树形结构和哈希结构。树形结构的关联式容器有4种:set、map 、multiset、multimap,它们的底层都是平衡搜索树(红黑树)。

zdlzf的博客 3442

【C++】-- STL之unordered_map/unordered_set详解

STL有两种容器:序列式容器和关联式容器,序列式容器vetor/lost/deque,用来存储数据。关联式容器map/set/unordered_map/unordered_set用来存储数据+查找数据。 unordered_map和unordered_set是c++里面两个提供哈希表的容器,map和set底层是红黑树,unordered_map和unordered_set的底层是哈希表(散列表),是一种映射。

局部变量和全局变量 2792

C++ STL unordered_map容器用法详解(超详版)

换句话说,unordered_map 容器和 map 容器仅有一点不同,即 map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的。具体来讲,unordered_map 容器和 map 容器一样,以键值对(pair类型)的形式存储数据,存储的各个键值对的键互不相同且不允许被修改。4) 当然,如果不想全部拷贝,可以使用 unordered_map 类模板提供的迭代器,在现有 unordered_map 容器中选择部分区域内的键值对,为新建 unordered_map 容器初始化。

weixin_51710308的博客 3697
上一篇: 红黑树与AVL树的区别
下一篇: C++ STL 之迭代器体系详解
Ricky_Theseus
博客等级 码龄3年 126粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ricky_Theseus

感谢大家,祝您生活愉快

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值