数据结构:哈希表(unordered_map)

unordered_map 是 C++ 标准库中的一种哈希表实现,它提供了基于键值对(key-value)的存储,提供了常数时间复杂度的查找、插入和删除键值对的操作。

初始化代码示例:

cpp 复制代码
#include <unordered_map>
using namespace std;


unordered_map<int, string> hashmap;   // 初始化一个空的哈希表 map


unordered_map<int, string> hashmap{{1, "one"}, {2, "two"}, {3, "three"}};// 初始化一个包含一些键值对的哈希表 map

另外,在C++哈希表中,如果被访问的是一个不存在的键,它会自动创建这个键,对应的值时默认构造的值。

cpp 复制代码
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
    // 初始化哈希表
    unordered_map<int, string> hashmap{{1, "one"}, {2, "two"}, {3, "three"}};


    cout << hashmap.empty() << endl;    // 检查哈希表是否为空,输出:0 (false)


    cout << hashmap.size() << endl;    // 获取哈希表的大小,输出:3

    // 查找指定键是否存在
    // 注意 contains 方法是 C++20 新增的
    // 输出:Key 2 -> two
    if (hashmap.contains(2)) {
        cout << "Key 2 -> " << hashmap[2] << endl;
    } else {
        cout << "Key 2 not found." << endl;
    }


    cout << hashmap[4] << endl;    // 获取指定键对应的值,若不存在会返回默认构造的值
    // 输出空字符串


    hashmap[4] = "four";    // 插入一个新的键值对


    cout << hashmap[4] << endl;    // 获取新插入的值,输出:four


    hashmap.erase(3);    // 删除键值对


    if (hashmap.contains(3)) {
        cout << "Key 3 -> " << hashmap[3] << endl;
    } else {
        cout << "Key 3 not found." << endl;
    }
    // 检查删除后键 3 是否存在
    // 输出:Key 3 not found.

    // 遍历哈希表
    // 输出(顺序可能不同):
    // 4 -> four
    // 2 -> two
    // 1 -> one
    for (const auto &pair: hashmap) {
        cout << pair.first << " -> " << pair.second << endl;
    }

    // 特别注意,访问不存在的键会自动创建这个键
    unordered_map<int, string> hashmap2;

    // 键值对的数量是 0
    cout << hashmap2.size() << endl; // 0

    // 访问不存在的键,会自动创建这个键,对应的值是默认构造的值
    cout << hashmap2[1] << endl; // empty string
    cout << hashmap2[2] << endl; // empty string

    // 现在键值对的数量是 2
    cout << hashmap2.size() << endl; // 2

    return 0;
}

哈希集合

unordered_set 是 C++ 标准库中的一种哈希集合实现,用于存储不重复的元素,常见使用场景是对元素进行去重。

初始化示例:

cpp 复制代码
#include <unordered_set>
using namespace std;


unordered_set<int> uset;    // 初始化一个空的哈希集合 set


unordered_set<int> uset{1, 2, 3, 4};  // 初始化一个包含一些元素的哈希集合 set

常用操作示例:

cpp 复制代码
#include <iostream>
#include <unordered_set>
using namespace std;

int main() {

    unordered_set<int> hashset{1, 2, 3, 4};    // 初始化哈希集合


    cout << hashset.empty() << endl;    // 检查哈希集合是否为空,输出:0 (false)


    cout << hashset.size() << endl;    // 获取哈希集合的大小,输出:4

    // 查找指定元素是否存在
    // 输出:Element 3 found.
    if (hashset.contains(3)) {
        cout << "Element 3 found." << endl;
    } else {
        cout << "Element 3 not found." << endl;
    }

    // 插入一个新的元素
    hashset.insert(5);

    // 删除一个元素
    hashset.erase(2);
    // 输出:Element 2 not found.
    if (hashset.contains(2)) {
        cout << "Element 2 found." << endl;
    } else {
        cout << "Element 2 not found." << endl;
    }

    // 遍历哈希集合
    // 输出(顺序可能不同):
    // 1
    // 3
    // 4
    // 5
    for (const auto &element : hashset) {
        cout << element << endl;
    }

    return 0;
}
相关推荐
Vacant Seat26 分钟前
贪心算法-买卖股票的最佳时机
java·数据结构·算法·贪心算法
郑州吴彦祖7721 小时前
数据结构——二叉树经典习题讲解
java·数据结构·算法·leetcode
lyx1426061 小时前
leetcode 8. 字符串转换整数 (atoi)
算法
qy发大财1 小时前
跳跃游戏II(力扣45)
算法·leetcode
Joyner20181 小时前
python-leetcode-相交链表
算法·leetcode·链表
和光同尘@1 小时前
74. 搜索二维矩阵(LeetCode 热题 100)
数据结构·c++·线性代数·算法·leetcode·职场和发展·矩阵
一去不复返的通信er1 小时前
SVD预编码
算法·信息与通信·预编码算法·通信原理
zl_dfq2 小时前
数据结构之【顺序表简介】
数据结构·顺序表
code bean2 小时前
【C# 数据结构】队列 FIFO
开发语言·数据结构·c#
柠石榴2 小时前
【练习】【二分】力扣热题100 34. 在排序数组中查找元素的第一个和最后一个位置
c++·算法·leetcode·二分