📜  在C++ STL中插入unordered_map(1)

📅  最后修改于: 2023-12-03 15:37:34.578000             🧑  作者: Mango

在C++ STL中插入unordered_map

什么是unordered_map?

unordered_map是C++ STL(标准模板库)中的容器之一,在头文件<unordered_map>中定义。unordered_map是一个关联式容器,它将每个键映射到唯一值。

与普通的map相比,unordered_map更适用于需要快速查找和插入元素的情况。它使用哈希表实现,哈希表是一个根据键直接访问值的数据结构,因此可以在几乎恒定的时间内找到和插入元素。

unordered_map的关键特性包括:

  • 快速查找和插入元素(几乎恒定的时间复杂度)
  • 可以使用自定义的哈希函数
  • 存储键值对,其中键唯一
unordered_map的基本用法

使用unordered_map之前,需要包含<unordered_map>头文件,并使用using命令指定命名空间std来避免使用std::前缀。

下面是一个简单的示例程序,演示unordered_map的基本用法:

#include <iostream>
#include <unordered_map>

using namespace std;

int main() {
    unordered_map<string, int> map;

    // 插入键值对
    map["apple"] = 3;
    map["banana"] = 2;
    map.insert({"orange", 4});

    // 查找键对应的值
    cout << "apple: " << map["apple"] << endl;

    // 遍历所有键值对
    for (auto it = map.begin(); it != map.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }

    return 0;
}

输出结果为:

apple: 3
banana: 2
orange: 4

该程序创建了一个unordered_map对象,然后插入了三个键值对。可以通过[]运算符或insert()方法插入键值对。键值对的类型必须与容器声明时指定的类型匹配。

对于查找操作,可以使用[]运算符获取键对应的值。如果键不存在,会自动添加一个默认值并返回。也可以使用find()方法进行查找,它返回一个迭代器,指向键值对的位置。

最后,遍历所有键值对可以使用迭代器。对于unordered_map,迭代器指向键值对的位置,可以通过迭代器的first和second成员访问键和值。

unordered_map中使用自定义的哈希函数

默认情况下,unordered_map使用std::hash模板类作为哈希函数,该模板类只定义了基本类型的哈希函数,而对于自定义类型,则需要手动实现一个哈希函数。

下面是一个自定义哈希函数的示例,用于计算字符串的哈希值:

struct StringHash {
    size_t operator()(const string& s) const {
        size_t hash = 0;
        for (char c : s) {
            hash = hash * 31 + c;
        }
        return hash;
    }
};

该哈希函数将字符串中每个字符的ASCII码值乘以一个质数31,并加上之前计算的哈希值。可以根据实际需求选择其他的质数。

使用自定义哈希函数创建unordered_map,只需要在容器声明中指定哈希函数即可:

unordered_map<string, int, StringHash> map;

完整的程序示例:

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

struct StringHash {
    size_t operator()(const string& s) const {
        size_t hash = 0;
        for (char c : s) {
            hash = hash * 31 + c;
        }
        return hash;
    }
};

int main() {
    unordered_map<string, int, StringHash> map;

    // 插入键值对
    map["apple"] = 3;
    map["banana"] = 2;
    map.insert({"orange", 4});

    // 查找键对应的值
    cout << "apple: " << map["apple"] << endl;

    // 遍历所有键值对
    for (auto it = map.begin(); it != map.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }

    return 0;
}
总结

unordered_map是一种非常实用的C++ STL容器,可以用于快速查找和插入唯一键值对。了解它的基本用法,以及如何使用自定义哈希函数,可以让程序员编写更高效、更灵活的代码。