数据结构:哈希表(unordered_map)

news/2025/2/22 21:42:01

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

初始化代码示例:

#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++哈希表中,如果被访问的是一个不存在的键,它会自动创建这个键,对应的值时默认构造的值。

 

#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++ 标准库中的一种哈希集合实现,用于存储不重复的元素,常见使用场景是对元素进行去重。

初始化示例:

#include <unordered_set>
using namespace std;


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


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

 常用操作示例:

#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;
}


http://www.niftyadmin.cn/n/5862786.html

相关文章

Oops! 更改field的数据类型,影响到rabbitmq消费了...(有关于Java序列化)

程序中有如下entity类-LevyPaymentFlow Data TableName(value "levy_payment_flow", autoResultMap true) public class LevyPaymentFlow implements Serializable {private static final long serialVersionUID 1L;TableId(type IdType.AUTO)private String flo…

【git】合并多个提交记录

1.说明 有时候因为某些小修改会导致代码多了很多不必要的提交&#xff0c;如果希望合并这些commit记录&#xff0c;我们可以使用rebase或者reset命令完成合并 2.rebase 这种方式是通过变基操作完成的&#xff0c;它适用于已经push到远程的情况&#xff0c;当我们变基好了之后…

RocketMq\Kafka如何保障消息不丢失?

程序那点事 保证RocketMq和Kafka消息不丢失需考虑Producer发送、Broker存储、Consumer消费。需配置同步发送/刷盘、重试机制、幂等性生产&#xff0c;手动提交偏移量等策略。摘要由作者通过智能技术生成 RocketMq架构图 RocketMq消息不丢失 要想保证消息不丢失&#xff0c;需…

《重构-》

一、代码坏的味道 神秘命名 ​​​​​代码应该直观明了。要深思熟虑如何给函数、模块、变量和类命名&#xff0c;使它们能清晰地表明 自己的功能和用法。 重复代码 一旦有重复代码存在&#xff0c;阅读这些重复的代码时你就必须加倍仔细&#xff0c;留意其间细微的差异。如果…

git使用-克隆远程项目、分支管理

文章目录 克隆远程项目到本地1. 远程找到需要克隆的项目&#xff0c;复制ssh地址2. idea开启git版本控制&#xff08;如果已经开了&#xff0c;忽略此步骤&#xff09;3. clone远端项目4. 克隆完成 分支管理1. 新建分支2. 切换分支3. 合并分支4. 储存变化 克隆远程项目到本地 …

软件架构设计:软件工程

一、软件工程概述 软件工程的定义 软件工程是应用系统化、规范化、可量化的方法开发、运行和维护软件。 软件工程的目标 提高软件质量、降低开发成本、缩短开发周期。 软件生命周期 瀑布模型&#xff1a;需求分析→设计→编码→测试→维护。迭代模型&#xff1a;分阶段迭代开…

【Leetcode 每日一题】2209. 用地毯覆盖后的最少白色砖块

问题背景 给你一个下标从 0 0 0 开始的 二进制 字符串 f l o o r floor floor&#xff0c;它表示地板上砖块的颜色。 f l o o r [ i ] floor[i] floor[i] 为 ‘0’ 表示地板上第 i i i 块砖块的颜色是 黑色 。 f l o o r [ i ] floor[i] floor[i] 为’1’ 表示地板上第 i …

【够用就好005】-在VSCode中管理ECS服务器的实操步骤

前景提要&#xff1a;接触过云服务器&#xff0c;当前有一个可以使用的ecs服务器。 关于如何搭建配置云服务不在今天分享主题内。 亲测有效&#xff01;&#xff01;&#xff01; 通过 VSCode 直接配置服务器步骤 一.先安装ssh插件 CTRL shift x 插件界面输入ssh安装remot…