学会吊打面试官之underedmap

news/2024/11/15 3:18:51/

 

小白:大牛你好!我最近学习了STL容器,看到有个叫做unordered_map的容器,这是什么?

大牛:unordered_map是一个无序的关联式容器,也就是一种键值对的存储结构,其中的元素没有固定的顺序。它和map类似,但是比map更快,适用于需要高效查找的场合。

小白:那unordered_map有哪些特点和用法呢?

大牛:unordered_map的特点主要是快速的查找速度,底层是通过哈希表实现的,所以在查找元素时平均时间复杂度为O(1)。而且,unordered_map的元素不是按照插入的顺序排列的,而是按照哈希值排列的。它的用法和map基本一致,可以使用insert、find、erase等函数。

小白:那我们来看一个具体的例子吧!

大牛:当然可以。比如我们要统计一段英文文本中每个单词出现的次数,可以使用unordered_map来实现。我们可以将每个单词作为键,出现次数作为值,然后遍历整个文本,将单词插入到unordered_map中,如果这个单词已经在unordered_map中存在,就将对应的值加1,否则插入一个新的键值对。

下面是一个简单的示例代码:

#include <iostream>
#include <unordered_map>
#include <string>using namespace std;int main()
{unordered_map<string, int> wordCount;string word;while (cin >> word){++wordCount[word];}for (const auto& pair : wordCount){cout << pair.first << ": " << pair.second << endl;}return 0;
}

这段代码会读入一段英文文本,统计每个单词出现的次数,并输出结果。在这个示例中,unordered_map的键是string类型的单词,值是int类型的出现次数。

小白:感谢大牛的解释,我终于理解了unordered_map的工作原理和使用方法。

大牛:不客气,如果你有任何疑问,随时可以问我。

小白:那我再问一个问题吧,unordered_map和map有什么区别?

大牛:这是一个常见的问题。unordered_map和map都是关联容器,但它们的实现方式不同。unordered_map内部使用哈希表实现,而map内部使用红黑树实现。哈希表的查找速度非常快,但是哈希表并不保证元素的顺序,而红黑树则可以保证元素的有序性。

小白:那么,我应该使用哪一个?

大牛:这取决于你的需求。如果你对元素的顺序没有要求,只是希望查找速度尽可能快,那么就可以使用unordered_map。如果你需要保证元素的顺序,或者需要进行范围查找等操作,那么就应该使用map。

小白:那我再问一个问题,unordered_map的底层实现原理是什么呢?

大牛:unordered_map的底层实现原理就是哈希表,哈希表是一种非常高效的数据结构。哈希表可以将键映射到一个唯一的索引值,这个索引值就是哈希值。然后,将键值对存储在这个索引值对应的位置,这样在查找时就可以直接根据键的哈希值来找到对应的位置,而无需遍历整个容器。

小白:那么,哈希表是如何处理哈希冲突的呢?

大牛:哈希冲突指的是不同的键可能会映射到同一个索引值的情况。哈希表需要处理哈希冲突,以保证键值对能够正确地存储和查找。哈希表处理哈希冲突的方法有很多种,最常用的方法是链表法。在链表法中,哈希表的每个位置不再存储一个单独的键值对,而是存储一个链表,所有哈希值相同的键值对都存储在这个链表中。这样,当发生哈希冲突时,只需要将新的键值对插入到对应位置的链表中即可。

小白:哦,我大概明白了,能否再举一个例子呢?

大牛:当然可以。比如我们要实现一个电话簿程序,可以使用unordered_map来存储每个人的姓名和电话号码。我们可以将每个人的姓名作为键,电话号码作为值,然后遍历整个电话簿,将每个人的姓名和电话号码插入到unordered_map中。如果发现姓名已经在unordered_map中存在,就更新对应的电话号码。

下面是一个简单的示例代码:

#include <iostream>
#include <unordered_map>
#include <string>using namespace std;int main()
{unordered_map<string, string> phonebook;string name, phone;while (cin >> name >> phone){phonebook[name] = phone;}for (const auto& pair : phonebook){cout << pair.first << ": " << pair.second << endl;}return 0;
}

这段代码会读入一些人的姓名和电话号码,将它们存储在unordered_map中,并输出结果。在这个示例中,unordered_map的键是string类型的姓名,值是string类型的电话号码。

小白:感谢大牛的解释和示例代码,我现在对unordered_map的底层实现和使用方法都有了更深入的理解。


http://www.ppmy.cn/news/38890.html

相关文章

[linux kernel]slub内存管理分析(0) 导读

文章目录简介整体目录SLUB中的结构体关系图kmalloc 申请逻辑逻辑图逻辑简述kfree 释放逻辑逻辑图逻辑简述slab page状态转换关系图简介 linux 内核内存管理算法有管理页面分配的伙伴算法&#xff0c;和对于小块内存的slab、slob、slub算法。其中slab是slob和slub的基础&#x…

开心档之开发入门网-C++ 有用的资源

C 有用的资源 目录 C 有用的资源 C 有用的网站 C 有用的书籍 以下资源包含了 C 有关的网站、书籍和文章。请使用它们来进一步学习 C 的知识。 C 有用的网站 C Standard Library headers − C 标准库。C Programming − 这本书涵盖了 C 语言编程、软件交互设计、C 语言的现…

CMake入门教程【基础篇】4.target_include_directories包含指定文件夹头文件

target_include_directories包含指定文件夹头文件 文章目录 知识点实例代码目录代码实现编译知识点 target_include_directories() 指定目标包含的头文件路径 实例 代码目录 |-📁prj3   |-- 🎴CMakeLists.txt   |-📁include    |-- 📄Hello.h   |-📁src…

java面试准备17

事务的四大特性 &#xff08;1&#xff09;原子性&#xff1a;事务执行的最小单位&#xff0c;不可被分割&#xff0c;事务的原子性保证事务中的一连串动作要么都执行&#xff0c;要么都不执行。 &#xff08;2&#xff09;一致性&#xff1a;执行事务前后的数据保持一致&…

Linux-Git

一、总论 1.1 写在前面的话 ​ 这已经是我第三遍学Git相关操作了&#xff0c;可以说这个玩意是真的狗&#xff0c;因为确实用不到&#xff0c;不知道下个学期会不会用到&#xff0c;直到现在我刚刚学完&#xff0c;处于知识水平的巅峰&#xff0c;知道Git的具体功能&#xff…

Linux系统,centos7系统安装以及使用教程

CentOS 7是一种基于Linux的操作系统&#xff0c;是红帽(Red Hat)企业版操作系统代码的开源再编译版本&#xff0c;是一种稳定、可靠、高性能的服务器操作系统。下面是一份CentOS 7系统的教程。 1.安装CentOS 7 下面介绍通过 DVD 安装 CentOS 7 的步骤&#xff1a; 1) 首先你…

gpt中文版下载-gpt3中文自动生成小说

chat软件怎么用 您可以通过以下步骤尝试使用OpenAI的Chat软件。 首先&#xff0c;访问OpenAI的网站。您可以在该网站上了解OpenAI的项目和产品&#xff0c;并获取相关信息。 在OpenAI的网站上&#xff0c;点击右上角的“Sign In”&#xff08;登录&#xff09;按钮。如果您没…

OpenCV实战(13)——高通滤波器及其应用

OpenCV实战(13)——高通滤波器以及应用 0. 前言1. 检测图像边缘1.2 Sobel 滤波器1.2 梯度算子1.3 高斯导数2. 图像拉普拉斯算子2.1 拉普拉斯算子2.2 使用拉普拉斯算子增强图像的对比度2.3 高斯差3. 完整代码小结系列链接0. 前言 在频域分析中,滤波器是一种放大图像某些频带…