C++——unordered_map讲解

2024-06-22 14:12
文章标签 c++ 讲解 map unordered

本文主要是介绍C++——unordered_map讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • unordered_map讲解
      • 1. 引入头文件
      • 2. 基本概念
      • 3. 声明和初始化
      • 4. 基本操作
        • 插入元素
        • 访问元素
        • 删除元素
        • 查找元素
        • 迭代器
      • 5. 注意事项
      • 6. 总结

unordered_map讲解

<unordered_map> 是 C++ 标准库中的一个头文件,提供了哈希表的实现,即无序关联容器。std::unordered_map 是一种关联容器,它使用哈希表来存储键值对,从而提供平均常数时间复杂度的查找、插入和删除操作。以下是对 <unordered_map> 详细讲解,包括其主要特性、使用方法和注意事项。

1. 引入头文件

#include <unordered_map>

2. 基本概念

  • 键值对std::unordered_map 中的每个元素都是一个键值对(key-value pair),其中键是唯一的,值可以重复。
  • 哈希表std::unordered_map 使用哈希表来存储元素,通过哈希函数将键映射到桶中,从而提供快速的查找和更新操作。

3. 声明和初始化

#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap;  // 创建一个空的 unordered_mapstd::unordered_map<int, std::string> umap2 = {{1, "one"}, {2, "two"}, {3, "three"}};  // 使用初始化列表return 0;
}

4. 基本操作

插入元素
  • insert(): 插入键值对
  • emplace(): 原地构造键值对
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap;umap.insert({1, "one"});  // 使用 insert() 插入键值对umap.emplace(2, "two");   // 使用 emplace() 原地构造键值对return 0;
}
访问元素
  • operator[]: 通过键访问或插入元素
  • at(): 通过键访问元素,若键不存在则抛出异常
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}};std::cout << umap[1] << std::endl;      // 输出 "one"std::cout << umap.at(2) << std::endl;   // 输出 "two"// 若键不存在,operator[] 会插入一个新的元素,at() 则会抛出异常std::cout << umap[3] << std::endl;      // 输出空字符串,并插入 {3, ""}try {std::cout << umap.at(4) << std::endl;  // 抛出异常} catch (const std::out_of_range& e) {std::cout << e.what() << std::endl;}return 0;
}
删除元素
  • erase(): 删除指定键的元素或删除指定位置的元素
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}, {3, "three"}};umap.erase(2);  // 删除键为 2 的元素for (const auto& pair : umap) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}
查找元素
  • find(): 查找键并返回指向该元素的迭代器
  • count(): 返回指定键的出现次数(对于 unordered_map,结果要么是 0 要么是 1)
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}, {3, "three"}};auto it = umap.find(2);  // 查找键为 2 的元素if (it != umap.end()) {std::cout << "Found: " << it->first << ": " << it->second << std::endl;} else {std::cout << "Not found" << std::endl;}std::cout << "Count of key 3: " << umap.count(3) << std::endl;  // 输出 1std::cout << "Count of key 4: " << umap.count(4) << std::endl;  // 输出 0return 0;
}
迭代器
  • begin(): 返回指向第一个元素的迭代器
  • end(): 返回指向最后一个元素后一位置的迭代器
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}, {3, "three"}};for (auto it = umap.begin(); it != umap.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;}return 0;
}

5. 注意事项

  • 无序性std::unordered_map 中的元素无序存储,不能依赖元素的插入顺序或访问顺序。
  • 哈希函数:默认情况下,std::unordered_map 使用 std::hash 来计算键的哈希值。如果需要自定义哈希函数,可以在模板参数中指定。
  • 负载因子:哈希表的性能与负载因子相关。负载因子是元素数量与桶数量的比值。通过 load_factor() 可以获取当前负载因子,通过 max_load_factor() 可以设置最大负载因子。
  • 性能std::unordered_map 的平均时间复杂度是常数时间,但在最坏情况下可能退化为线性时间。选择合适的哈希函数和负载因子可以提高性能。

6. 总结

<unordered_map> 提供了高效的键值对存储和查找功能,是 C++ 标准库中非常有用的容器之一。通过掌握其基本操作和注意事项,可以在各种编程场景中高效地使用 std::unordered_map

这篇关于C++——unordered_map讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084512

相关文章

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL