unordered_map应用以及实现原理介绍

106 阅读3分钟

unordered_map是C++标准库中的一个容器,它对于存储键值对类型的数据非常有用。unordered_map同样也是哈希表的一种实现。在使用unordered_map时,需要包含头文件<unordered_map>。

一、unordered_map应用介绍

unordered_map是C++标准库中的一个容器,它提供了将键映射到值的功能,使我们可以快速的查找和访问键值对。unordered_map可以存储任意类型的数据,键和值可以是不同的类型。在C++11以前,我们一般使用map或者hash_map来完成同样的工作,但是从C++11开始,由于unordered_map的效率提高,它已经成为了首选的容器类型。

二、unordered_map实现原理介绍

unordered_map是由哈希表实现的,具体实现方式是散列函数。哈希表是将数据存在一个数组中,将这个数组称为哈希表,在这些数组元素中存放的就是键值对。在使用unordered_map时,想要从中查找某个key值对应的value值,我们需要在数组中找到这个元素,而不是遍历整个库,这样就可以大大提高查找元素的效率。

散列函数是unordered_map实现的关键,它决定了元素在哈希表中的存储位置。散列函数接受键值对作为参数,返回一个索引值。在unordered_map的内部结构中,哈希表是由桶(bucket)组成的,桶中存放的是键值对,多个键值对可以存放在同一个桶中。当我们插入一个键值对时,我们需要先计算其散列值,然后根据散列值找到对应的桶。在C++语言标准化之前,一些语言使用的哈希表,如__gnu_cxx::hash_map,使用的是开链法,但是 unordered_map使用的是平衡二叉树和红黑树,这种方式避免了链表退化的情况。

三、unordered_map应用举例

我们来看一下unordered_map如何应用在实际中。假设我们有一个学校的所有学生的信息,包括学生的姓名和学号。我们要实现一个程序,可以根据学生的姓名来查找学生的学号。

#include &lt;iostream&gt;
#include &lt;unordered_map&gt;

using namespace std;

int main()
{
    unordered_map&lt;string, int&gt; students;

    // 插入学生信息
    students["Jack"] = 1001;
    students["Lucy"] = 1002;
    students["Tom"] = 1003;
    students["Lily"] = 1004;

    // 查找学生信息
    string name;
    cout &lt;&lt; "请输入要查找的学生姓名:" ;
    cin &gt;&gt; name;
    if (students.find(name) != students.end())
    {
        cout &lt;&lt; "学生 " &lt;&lt; name &lt;&lt; " 的学号为:" &lt;&lt; students[name] &lt;&lt; endl;
    }
    else
    {
        cout &lt;&lt; "未找到该学生信息" &lt;&lt; endl;
    }

    return 0;
}

以上代码中,我们首先定义了一个unordered_map容器,其中键是string类型,值是int类型。然后我们向这个容器中插入四个元素,分别是四个学生的信息。接着,我们从用户输入要查找的学生姓名,然后利用find函数查找这个学生的学号,如果存在,则输出对应的学号,否则输出未找到该学生信息的提示语。

四、小结

unordered_map是C++标准库中的一个容器,它提供了将键映射到值的功能,使我们可以快速的查找和访问键值对。unordered_map是基于哈希表实现的,它的效率非常高。在使用unordered_map时,需要注意键值对的类型匹配,同时需要开足桶的数量,以免导致桶的链过长,影响效率。