C++(10): std::map、std::multimap与std::unordered_map

1. 简述

        std::map、std::multimap 和 std::unordered_map 是 C++ 标准模板库(STL)中的三种关联容器,它们提供了存储键值对(pair)的方式,并允许通过键来快速检索值。这三者之间的主要区别在于它们的内部数据结构和对元素的排序方式。

2. std::map的特点

有序性:std::map 中的元素按照键的顺序存储,因此可以高效地进行中序遍历。

唯一性:每个键在 std::map 中都是唯一的,不允许重复的键存在。

性能:std::map 提供了对元素的高效查找、插入和删除操作,时间复杂度通常为 O(log n)。

内存消耗:由于使用平衡二叉搜索树,std::map 相比于 std::unordered_map 可能会有更高的内存消耗。

可预测性:由于元素的有序性,std::map 在迭代时提供了可预测的顺序,这在某些算法中非常有用。

3. std::map构造及其用法

(1)构造map

        首先需要引用头文件:#include <map>

        默认构造:

std::map<int, std::string> amap;

        使用初始化列表进行构造:

std::map<int, std::string> myMap = {  

    {1, "one"},  

    {2, "two"},  

    {3, "three"}  

};

        复制构造:

std::map<int, std::string> myMap1 = { {1, "one"}, {2, "two"} };

std::map<int, std::string> myMap2(myMap1);

(2)插入

        构造std::pair并插入:

amap.insert(std::pair<int, std::string>(5, “Derek”));

        使用make_pair(无需专门指定类型):

amap.insert(std::make_pair(5, “Derek”));

        使用amap的value_type构造插入:

amap.insert(std::map<int, std::string>::value_type(5, “Derek”));

        使用数组方式插入(注意,这种方式会覆盖原有已经存在的键值对):

amap.insert[1] = “Eaton”;

(3)删除元素

it = myMap.erase(it); // 删除迭代器指向的元素

        当使用迭代器删除元素以后,需要更新迭代器(原迭代器已经失效)。

myMap.erase(myMap.begin(), myMap.end()); // 删除所有元素

(4)查找元素

        std::map的元素查找可以使用find。

auto it = myMap.find(3);

if (it != myMap.end()) {

  // 找到元素

}

(5)访问元素

        可以使用下标或at访问元素。

std::string name = amap[2];

std::string name = amap.at(2);

        值得注意的是,使用at进行元素的访问过程中,如果元素不存在,则会报出std::out_of_range异常。

(6)获取大小

amap.size();

4. std::map例程

#include <iostream>#include <map>int main(int argc, char* argv[]){/** 创建一个 std::map. */std::map<int, std::string> myMap;/** 插入键值对. */myMap.insert({1, "One"});myMap.insert({2, "Two"});myMap.insert({3, "Three"});/** 遍历 std::map. */for (const auto& pair : myMap) {std::cout << pair.first << ": " << pair.second << std::endl;}/** 访问元素. */std::cout << "The value for key 2 is: " << myMap[2] << std::endl;return 0;}

5. std::multimap

        std::multimap 是 C++ 标准模板库中的一个关联容器,它类似于 std::map,但允许每个键关联多个值。std::multimap 基于平衡二叉搜索树实现,因此它保持了元素的有序性,按照键的顺序组织元素。

6. std::multimap的特点

键的多重性:与 std::map 不同,std::multimap 允许一个键对应多个值。

有序性:std::multimap 中的元素按照键的顺序存储,因此可以高效地进行中序遍历。

性能:std::multimap 提供了对元素的高效查找、插入和删除操作,时间复杂度通常为 O(log n)。

内存消耗:由于使用平衡二叉搜索树,std::multimap 相比于 std::unordered_multimap 可能会有更高的内存消耗。

7. std::multimap例程

#include <iostream>#include <multimap>int main(int argc, char* argv[]){/** 创建一个 std::multimap. */std::multimap<int, std::string> myMultiMap;// 插入具有相同键的多个元素myMultiMap.insert({1, "One"});myMultiMap.insert({1, "Uno"});myMultiMap.insert({2, "Two"});myMultiMap.insert({3, "Three"});/** 遍历 std::multimap. */for (const auto& pair : myMultiMap) {std::cout << pair.first << ": " << pair.second << std::endl;}/** 查找具有特定键的所有元素. */auto range = myMultiMap.equal_range(1);std::cout << "Values for key 1: ";for (auto it = range.first; it != range.second; ++it) {std::cout << it->second << " ";}std::cout << std::endl;/** 访问特定键的第一个值. */std::string firstValue;auto it = myMultiMap.find(2);if (it != myMultiMap.end()) {firstValue = it->second;}std::cout << "The first value for key 2 is: " << firstValue << std::endl;/** 删除特定键的所有元素. */myMultiMap.erase(3);/** 再次遍历 std::multimap 确认元素已被删除. */std::cout << "Multimap after erasing key 3:" << std::endl;for (const auto& pair : myMultiMap) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;}

8. unordered_map

        std::unordered_map 是一个基于哈希表的容器,它提供了最快的平均时间复杂度(通常是 O(1))来访问元素。与 std::map 和 std::multimap 不同,std::unordered_map 中的元素没有特定的顺序,元素的顺序取决于哈希函数和哈希表的内部结构。

9. std::unordered_map特点

无序性:std::unordered_map 中的元素不是按照键的顺序存储的,而是根据键的哈希值。

快速访问:由于使用了哈希表,std::unordered_map 通常能够提供接近常数时间复杂度(O(1))的查找、插入和删除操作。

内存消耗:相比于 std::map,std::unordered_map 可能会有更多的内存消耗,因为哈希表需要额外的空间来存储桶(buckets)和哈希值。

键的唯一性:std::unordered_map 中的键是唯一的,不允许有重复的键存在。

10. std::unordered_map例程

#include <iostream>#include <unordered_map>int main(int argc, char*argv[]){/** 创建一个 std::unordered_map. */std::unordered_map<int, std::string> myUnorderedMap;/** 插入键值对. */myUnorderedMap.insert({1, "One"});myUnorderedMap.insert({2, "Two"});myUnorderedMap.insert({3, "Three"});/** 遍历 std::unordered_map. */for (const auto& pair : myUnorderedMap) {std::cout << pair.first << ": " << pair.second << std::endl;}/** 访问特定键的值. */std::string value = myUnorderedMap.at(2); ///< 抛出异常,如果键不存在/** 或者使用下标操作符,它返回一个默认值如果键不存在. */std::string value2 = myUnorderedMap[2];/** 查找元素. */auto it = myUnorderedMap.find(3);if (it != myUnorderedMap.end()) {std::cout << "The value for key 3 is: " << it->second << std::endl;}/** 删除元素. */myUnorderedMap.erase(it); ///< 删除迭代器指向的元素myUnorderedMap.erase(1); ///< 删除特定键的所有元素/** 再次遍历 std::unordered_map 确认元素已被删除. */std::cout << "Unordered map after erasing keys 1 and 3:" << std::endl;for (const auto& pair : myUnorderedMap) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/800634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA实现网络爬虫

在Java中实现网络爬虫&#xff0c;可以使用Java内置的java.net.URL和java.net.URLConnection类来发送HTTP请求&#xff0c;也可以使用更高级的库&#xff0c;如Apache的HttpClient和Jsoup&#xff0c;后者可以方便地解析HTML文档。 以下是一个使用HttpClient和Jsoup的Java网络…

day14 java接口

接口 接口&#xff1a;对不同类型不同事物相同功能的描述&#xff08;一定程序上解决了单继承的局限性&#xff09;接口可以理解成一种标准 规范当类实现这个接口就实现了这个标准或规范接口的格式&#xff1a;权限修饰符 interface 接口名{}权限修饰符只能是public和缺省的。…

ElementUI使用问题记录:设置路由+iconfont图标+自定义表单验证

一、关于导航怎么设置路由 1、在el-menu这个标签的属性中添加 router ,官方文档的解释是&#xff1a;启用vue-router 这种模式 2、在el-menu-item标签中的index属性直接书写路由&#xff0c;就可以实现正常vue-router了 3、在el-menu-item标签中书写路由属性&#xff1a;:route…

【C++进阶】哈希的应用之位图和布隆过滤器

位图和布隆过滤器 一&#xff0c;位图1. 实现2. 位图的应用 二&#xff0c;布隆过滤器1. 使用场景2. 模拟实现 三&#xff0c;海量数据面试题哈希切分 四&#xff0c;总结 这一节我们来看哈希的应用 一&#xff0c;位图 先来看一个面试题 这里如果用unordered_set来解决&…

C++学习笔记三--基本控制语句

目录 前言 一、C语句 二、顺序结构 1.声明语句 2.表达式语句 3.基本输入/输出语句 4.复合语句和空语句 三、选择结构 1.if语句 2.switch语句 四、循环结构 1.for语句 2.while语句 3.do...while语句 4.循环的嵌套 五、跳转语句 前言 这篇文章介绍一…

C++11可变模板参数:海纳百川的Args

目录 一、可变模板参数的概念及功能 1.1Args的概念与使用 1.2获取args中的参数 二、emplace可变模板参数的实际应用 三、逗号表达式展开参数包 一、可变模板参数的概念及功能 1.1Args的概念与使用 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板…

二维码门楼牌管理应用平台建设:物业缴费的数字化革新

文章目录 前言一、物业缴费的数字化革新二、在线缴费功能的实现三、智能化缴费管理的优势四、面临的挑战与未来展望五、结语 前言 随着科技的不断进步&#xff0c;二维码门楼牌管理应用平台已成为物业管理的新趋势。在这样一个平台上&#xff0c;物业缴费的数字化革新不仅提高…

【计算机网络】TCP协议可靠传输保证(序列号/确认应答机制、超时重传、最长消息长度、滑动窗口控制、拥塞控制)

TCP协议可靠传输 1.序列号确认应答机制2.超时重传3.最长消息长度4.滑动窗口控制5.拥塞控制 1.序列号确认应答机制 这个机制类似于问答的形式。比如在课堂上老师会问你“明白了吗&#xff1f;”&#xff0c;假如你没有隔一段时间没有回应或者你说不明白&#xff0c;那么老师就会…

橘子学JDK之JMH-03(@State)

这里我们来搞官方的第三个案例&#xff0c;引入新的注解State。 一、案例三代码 package com.levi;/*** Description:* Author: Levi* Date: 2024/4/8 18:44*/import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.R…

【YOLOV8】项目目录重点部分介绍和性能评估指标

目录 一 项目目录重点部分介绍 二 性能评估指标 一 项目目录重点部分介绍 1 ultralytics

揭秘Dropbear SSH:轻量级的安全外壳协议实现

在远程管理和通讯的世界里&#xff0c;安全是至关重要的一环。SSH&#xff08;Secure Shell&#xff09;协议是互联网上用于安全远程登录和其他网络服务的标准方式。当我们提到SSH时&#xff0c;OpenSSH可能是最广为人知的实现。然而&#xff0c;在资源受限的环境中&#xff0c…

windows环境变量滥用维权/提权

0x01 前提 通过滥用系统的路径搜索机制来欺骗高权限用户执行看似合法的系统二进制文件&#xff0c;实际上是恶意的代码或程序&#xff0c;从而导致升权限并执行恶意操作。 攻击的关键前提&#xff1a; 路径搜索顺序&#xff1a; 当用户在命令行或程序中执行一个命令时&#x…

kafka 高吞吐设计分析

说明 本文基于 kafka 2.7 编写。author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 概括 支撑 kafka 高吞吐的设计主要有以下几个方面: 网络 nio 主从 reactor 设计模式 顺序写。 零拷贝。 producer producer 开启压缩后是批量压缩&#xff0c;bro…

【Qt】:常用控件(七:输入类控件)

常用控件 一.Combo Box&#xff08;下拉框&#xff09;二.Spin Box&#xff08;微调框&#xff09;三.ate Edit&Time Edit&#xff08;日期微调框&#xff09;四.Dial&#xff08;旋钮&#xff09;五.Slider&#xff08;滑动条&#xff09; 一.Combo Box&#xff08;下拉框…

738.单调递增的数字

// 定义一个名为Solution的类 class Solution { public:// 定义公共成员函数&#xff1a;计算并返回大于等于输入整数N且其各位数字非降序排列的最小整数int monotoneIncreasingDigits(int N) {// 将整数N转换成字符串形式&#xff0c;方便操作每一位数字string strNum to_str…

23linux 自定义shell文件系统

打印环境变量&#xff0c;把当前子进程所有环境变量打印出来 环境变量也是一张表&#xff08;指针数组以null结尾&#xff0c;最后条件不满足就退出了 &#xff09; 用子进程调用 结论1 当我们进行程序替换的时候 &#xff0c;子进程对应的环境变量&#xff08;子进程的环境变…

聚焦ChatGPT:学术写作全攻略

ChatGPT无限次数:点击直达 聚焦ChatGPT&#xff1a;学术写作全攻略 引言 在当今信息爆炸的时代&#xff0c;学术写作对于研究人员和学生来说是至关重要的技能。而随着人工智能的不断发展&#xff0c;ChatGPT作为一个强大的自然语言处理工具&#xff0c;为学术写作带来了全新的…

Mybatis执行器(Executor)

Executor简介 Executor Executor是MyBatis的核心接口之一&#xff0c;其中定义了数据库操作的基本方法。在实际应用中经常涉及的SqlSession接口的功能&#xff0c;都是基于Executor接口实现的。 BaseExecutor BaseExecutor是一个实现了Executor接口的抽象类,它实现了Execut…

pytorch 与 python版本对应关系

pytorch 与 python版本对应关系 torchtorchvisionPythonmain / nightlymain / nightly>3.8, <3.112.20.17>3.8, <3.112.10.16>3.8, <3.112.00.15>3.8, <3.111.130.14>3.7.2, <3.101.120.13>3.7, <3.101.110.12>3.7, <3.101.100.11&…