C++容器之无序映射(std::unordered_map)

2024-05-27 02:44

本文主要是介绍C++容器之无序映射(std::unordered_map),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1 概述
  • 2 使用实例
  • 3 接口使用
    • 3.1 construct
    • 3.2 assigns
    • 3.3 iterators
    • 3.4 capacity
    • 3.5 access
    • 3.6 find/count/equal_range
    • 3.7 emplace
    • 3.8 emplace_hint
    • 3.9 insert
    • 3.10 erase
    • 3.11 clear
    • 3.12 swap
    • 3.13 bucket_count
    • 3.14 max_bucket_count
    • 3.15 bucket_size
    • 3.16 bucket
    • 3.17 load_factor
    • 3.18 max_load_factor
    • 3.19 rehash
    • 3.20 reserve
    • 3.21 hash_function
    • 3.22 key_eq
    • 3.23 get_allocator

1 概述

  无序映射是一种关联容器,用于存储由键值和映射值组合而成的元素,并允许基于其键快速检索单个元素。
  在无序映射中,键值通常用于唯一标识元素,而映射的值是一个对象,其内容与该键相关联。键和映射值的类型可能不同。
  在内部,无序映射中的元素不按任何特定的顺序相对于其键值或映射值进行排序,而是根据其哈希值组织到桶中,以允许直接通过其键值快速访问各个元素(平均具有恒定的平均时间复杂度)。
  无序映射容器比映射容器更快地通过关键字访问单个元素,尽管它们通常在通过元素子集进行范围迭代时效率较低。
无序映射实现了直接访问运算符(运算符[]),该运算符允许使用映射值的键值作为参数直接访问映射值。
容器中的迭代器至少是前向迭代器。
容器特性:

  • 关联性 关联容器中的元素由它们的键(Key)引用,而不是由它们在容器中的绝对位置引用。
  • 无序性 无序容器使用哈希表来组织其元素,哈希表允许通过其键快速访问元素。
  • 映射性 每个元素都将一个键与映射值相关联:键用于标识其内容为映射值的元素。
  • 唯一性 容器中没有两个元素可以具有等效的键。
  • 分配器感知 容器使用分配器对象来动态处理其存储需求。
  • 其类图如下:
    类图

2 使用实例

void UnorderedMapSuite::rehash()
{std::unordered_map<std::string, std::string> a;a.rehash(12);TEST_ASSERT_EQUALS(true, a.bucket_count() > 12)a.insert({ "apple", "red" });a.insert({ "pear", "yellow" });a.insert({ "banana", "yellow" });a.insert({ "banana", "yellow" });uint32_t bucket_count = a.bucket_count();a.rehash(11);TEST_ASSERT_EQUALS(bucket_count, a.bucket_count())a.rehash(5);TEST_ASSERT_EQUALS(true, a.bucket_count() < bucket_count)
}

3 接口使用

3.1 construct

template<class T>
T merge_map(T const & a, T const& b)
{T t(a);t.insert(b.begin(), b.end());return t;
}void UnorderedMapSuite::construct()
{std::unordered_map<std::string, std::string> a;std::unordered_map<std::string, std::string> b({ { "apple", "red" }, { "pear", "yellow" }, { "banana", "yellow" }, { "banana", "yellow" } });std::unordered_map<std::string, std::string> c({ { "mango", "yellow" }, { "strawberry", "red" } });std::unordered_map<std::string, std::string> d(b);std::unordered_map<std::string, std::string> e(merge_map(b, c));std::unordered_map<std::string, std::string> f(e.begin(), e.end());TEST_ASSERT_EQUALS(true, a.empty())TEST_ASSERT_EQUALS(3, b.size())TEST_ASSERT_EQUALS(2, c.size())TEST_ASSERT_EQUALS(3, d.size())TEST_ASSERT_EQUALS(5, e.size())TEST_ASSERT_EQUALS(5, f.size())
}

3.2 assigns

void UnorderedMapSuite::assigns()
{std::unordered_map<std::string, std::string> a;std::unordered_map<std::string, std::string> b;std::unordered_map<std::string, std::string> c;std::unordered_map<std::string, std::string> d;a = { { "apple", "red" }, { "pear", "yellow" }, { "banana", "yellow" }, { "banana", "yellow" } };b = { { "mango", "yellow" }, { "strawberry", "red" } };c = merge_map(a, b);d = c;TEST_ASSERT_EQUALS(3, a.size())TEST_ASSERT_EQUALS(2, b.size())TEST_ASSERT_EQUALS(5, c.size())TEST_ASSERT_EQUALS(5, d.size())
}

3.3 iterators

void UnorderedMapSuite::iterators()
{std::unordered_map<std::string, std::string> names = { { "apple", "red" }, { "pear", "yellow" }, { "banana", "yellow" }, { "banana&#

这篇关于C++容器之无序映射(std::unordered_map)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象