《21天学通C++》(第二十章)STL映射类(map和multimap)
为什么需要
map
和multimap
:
1.查找高效: 映射类允许通过键快速查找对应的值,这对于需要频繁查找特定元素的场景非常适合。
2.自动排序: 会自动根据键的顺序对元素进行排序
3.多级映射: 映射类可以嵌套使用,创建多级映射,这对于复杂的数据结构非常有用
4.键值对存储: 映射类专门设计用于存储键值对(key-value)
map
和multimap
之间的区别在于,后者能够存储重复的键,而前者只能存储唯一的键,要使用需要包含头文件<map>
1.实例化map和multimap
map
实例化:
std::map<key_type, value_type> map_instance;
//key_type 是键的类型。
//value_type 是与每个键关联的值的类型。
#include <iostream>
#include <map>int main() {// 实例化std::map,键类型为int,值类型为std::stringstd::map<int, std::string> myMap;// 向map中添加元素myMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 打印map和multimap的内容std::cout << "Map:" << std::endl;for (const auto& pair : myMap) {std::cout << pair.first << " : " << pair.second << std::endl;}// 尝试添加重复的键,这将更新已存在的键对应的值myMap[1] = "ONE"; // "one" 将被 "ONE" 替换// 打印map的内容std::cout << "Map:" << std::endl;for (const auto& pair : myMap) {std::cout << pair.first << " : " << pair.second << std::endl;}system("pause");return 0;
}
multimap
实例化:
std::multimap<key_type, value_type> multimap_instance;
//key_type 是键的类型,可以有重复。
//value_type 是与每个键关联的值的类型。
#include <iostream>
#include <map>int main() {// 实例化std::multimap,允许有相同键的多个元素std::multimap<int, std::string> myMultimap;// 向multimap中添加具有相同键的多个元素myMultimap.insert(std::make_pair(1, "uno"));myMultimap.insert(std::make_pair(1, "eins"));// 打印multimap的内容std::cout << "Multimap:" << std::endl;for (const auto& pair : myMultimap) {std::cout << pair.first << " : " << pair.second << std::endl;}system("pause");return 0;
}
2.在map和multimap中插入元素
使用insert()
成员函数插入
//key为键,val为值
map.insert(std::make_pair(key,val));
map.insert(std::pair<int,string>(key,val));
map[key]=val;//multimap操作相同,但无法使用数组语法[]来插入
#include <iostream>
#include <map>
using namespace std;int main() {// 实例化std::multimap,允许有相同键的多个元素multimap<int, string> myMultimap;// 向multimap中添加具有相同键的多个元素myMultimap.insert(make_pair(1, "one"));myMultimap.insert(pair<int,string>(1, "two"));// 打印multimap的内容cout << "Multimap:" << endl;for (const auto& pair : myMultimap) {cout << pair.first << " : " << pair.second << endl;}//实例化std::mapmap<int,string> myMap;//向map中添加元素myMap[1]="map_one";myMap.insert(make_pair(2,"map_two"));myMap.insert(pair<int,string>(3,"map_three"));// 打印map的内容cout << "map:" << endl;for (const auto& pair : myMap) {cout << pair.first << " : " << pair.second << endl;}system("pause");return 0;
}
3.在map和multimap中查找元素
使用find()
成员函数,该函数会返回一个迭代器
在map
中查找
#include <map>
#include <iostream>
#include <string>int main() {std::map<int, std::string> myMap;myMap[1] = "one";myMap[2] = "two";// 查找键为1的元素auto it = myMap.find(1);//检查是否查找成功if (it != myMap.end()) {//myMap.end()指向容器的末尾,即最后一个元素之后的位置//如果已经找到了,就不会指向这个位置,反之则没有找到std::cout << "Found: " << it->second << std::endl; // 输出 "Found: one"} else {std::cout << "Not found" << std::endl;}// 查找键为3的元素,这个键不存在于map中it = myMap.find(3);if (it == myMap.end()) {std::cout << "Not found" << std::endl;}system("pause");return 0;
}
在multimap
中查找
因为mulitimap
允许包含多个键相同的键值对,所以可以用multimap::count()
函数确定有多少个,再对迭代器进行递增,来访问这些值
#include <map>
#include <iostream>
#include <string>int main() {std::multimap<int, std::string> myMultimap;// 插入具有相同键的不同值的元素myMultimap.insert(std::make_pair(1, "one"));myMultimap.insert(std::make_pair(1, "ONE"));myMultimap.insert(std::make_pair(2, "two"));// 查找键为1的元素auto it = myMultimap.find(1);// 如果找到了至少一个元素if (it != myMultimap.end()) {// 使用count()确定键为1的元素数量size_t count = myMultimap.count(1);// 遍历所有具有键为1的元素for (size_t i = 0; i < count; ++i) {std::cout << it->second << " ";// 递增迭代器以移动到下一个具有相同键的元素++it;}}// 如果没有找到键为1的元素,输出"Not found"else {std::cout << "Not found" << std::endl;}system("pause");return 0;
}
4.删除map和multimap中的元素、
使用erase()
函数,有以下几种版本
删除指定位置的元素
map.erase(iterator pos);//使用迭代器
map.erase(key);//使用键
删除指定范围的元素
map.erase(iterator first, iterator last);//使用迭代器确定边界
#include <map>
#include <iostream>
#include <string>int main() {std::multimap<int, std::string> myMultimap;// 插入具有相同键的不同值的元素myMultimap.insert(std::make_pair(1, "one"));myMultimap.insert(std::make_pair(1, "ONE"));myMultimap.insert(std::make_pair(2, "two"));myMultimap.insert(std::make_pair(3, "three"));myMultimap.insert(std::make_pair(4, "four"));myMultimap.insert(std::make_pair(5, "five"));//删除键为2myMultimap.erase(2);//删除键为1的元素myMultimap.erase(myMultimap.find(1));//只能删除one,而ONE删不掉//删除键3和键4auto it3=myMultimap.find(3);auto it4=myMultimap.find(4);myMultimap.erase(it3,it4);for(auto& pair:myMultimap){std::cout<<pair.first<<":"<<pair.second<<std::endl;}system("pause");return 0;
}
输出结果
5.提供自定义排序谓词
语法
#include <map>
#include <iostream>
#include <string>// 自定义比较函数
struct CustomCompare {bool operator()(int a, int b) const {// 基于字符串长度进行比较return std::to_string(a).length() < std::to_string(b).length();}
};int main() {// 使用自定义比较函数的std::mapstd::map<int, std::string, CustomCompare> myMap;// 使用自定义比较函数的std::multimapstd::multimap<int, std::string, CustomCompare> myMultimap;// 向map中插入元素。由于map中键必须是唯一的,这里插入的元素将根据自定义的比较逻辑被排序。myMap.insert({100, "Hundred"});myMap.insert({10, "Ten"});myMap.insert({1000, "Thousand"});// 向multimap中插入元素。multimap允许有相同键的多个元素。myMultimap.insert({100, "Hundred"});myMultimap.insert({10, "Ten"});myMultimap.insert({1000, "Thousand"});myMultimap.insert({100, "Another Hundred"}); // 允许重复键// 遍历map并打印键值对std::cout << "Map contents:" << std::endl;for (const auto& pair : myMap) {std::cout << pair.first << " : " << pair.second << std::endl;}// 遍历multimap并打印键值对std::cout << "Multimap contents:" << std::endl;for (const auto& pair : myMultimap) {std::cout << pair.first << " : " << pair.second << std::endl;}system("pause");return 0;
}
6.基于散列表的unordered_map和unordered_multimap
从C++11起,支持散列映射,要使用这两个容器,需要包含<unordered_map>
,有以下特点
- 因为散列表的特性,理想情况下性能更高,最坏情况下性能更差
- 无序性
基本操作
#include <unordered_map>
#include <iostream>
#include <string>int main() {// 使用整数作为键,字符串作为值的unordered_mapstd::unordered_map<int, std::string> um;// 插入元素um.insert({1, "one"});um[2] = "two"; // 使用下标操作符// 查找元素auto it = um.find(1);if (it != um.end()) {std::cout << "Found: " << it->second << std::endl; // 输出 "Found: one"} else {std::cout << "Element with key 1 not found" << std::endl;}// 删除键为1的元素um.erase(1);// 再次尝试查找键为1的元素it = um.find(1);if (it == um.end()) {std::cout << "Element with key 1 not found after erase" << std::endl;}// 使用整数作为键,字符串作为值的unordered_multimapstd::unordered_multimap<int, std::string> umm;// 插入具有相同键的多个元素umm.insert({1, "one"});umm.insert({1, "ONE"});// 查找所有键为1的元素auto range = umm.equal_range(1);for (auto it = range.first; it != range.second; ++it) {std::cout << it->second << " "; // 输出 "one ONE"}std::cout << std::endl;// 删除所有键为1的元素umm.erase(1);// 再次查找键为1的元素,应该找不到range = umm.equal_range(1);if (std::distance(range.first, range.second) == 0) {std::cout << "No elements with key 1 found after erase" << std::endl;}system("pause");return 0;
}
相关文章:

《21天学通C++》(第二十章)STL映射类(map和multimap)
为什么需要map和multimap: 1.查找高效: 映射类允许通过键快速查找对应的值,这对于需要频繁查找特定元素的场景非常适合。 2.自动排序: 会自动根据键的顺序对元素进行排序 3.多级映射: 映射类可以嵌套使用,创…...

5月游戏市场迎来新的体验,网易两款游戏重磅出炉
易采游戏网5月9日消息,随着科技的飞速发展,手机游戏已经成为人们休闲娱乐的重要方式。在这个领域,网易作为国内领先的游戏开发商,一直致力于为玩家带来高品质的游戏体验。近日,网易携手国际大厂Square Enix,…...

15_Scala面向对象编程_访问权限
文章目录 Scala访问权限1.同类中访问2.同包不同类访问3.不同包访问4.子类权限小结 Scala访问权限 知识点概念 private --同类访问private[包名] --包私有; 同类同包下访问protected --同类,或子类 //同包不能访问(default)(public)默认public --公…...
LeetCode|700. Search in Binary Search Tree
题目 You are given the root of a binary search tree (BST) and an integer val. Find the node in the BST that the node’s value equals val and return the subtree rooted with that node. If such a node does not exist, return null. Example 1: Input: root […...

MacOS下载安装JDK8
一、前言 今天给苹果电脑安装JDK环境,后续打算把Mac系统也用起来,也体验一把用苹果系统开发。 JDK就不过多介绍了,大家都是JAVA开发,JDK就是JAVA开发的必要环境。目前已经更新到JDK20了,不过我是不会更新的࿰…...
macOS 如何使用Visual Studio Code 编译C++
在 macOS,则默认系统 C++ 编译器是 Clang。 要使用 Visual Studio Code 在 macOS 上的 Clang 中指定 C++ 版本,可以按如下所示修改tasks.json 文件: 在 Visual Studio Code 中打开您的 C++ 项目。按 Ctrl+Shift+P(或 macOS 上的 Cmd+Shift+P)打开命令面板。在命令面板中键…...
SQLite3简单操作
SQLite命令 文章目录 SQLite命令一、创建数据库二、表的操作1、创建表2、删除表 一、创建数据库 注:使用Ubuntu服务器操作,安装sqlite3 sudo apt update sudo apt install sqlite3 sqlite3 --version1、SQLite主要使用命令sqlite3来创建新的数据库 sq…...

从“制造”到“智造”:“灯塔”经验助力中国制造业转型升级-转载
作者:Karel Eloot,侯文皓,Francisco Betti,Enno de Boer和Yves Giraud 作为中国实体经济的主体,制造业是推动中国经济发展乃至全球制造业持续增长的重要引擎。站在历史与未来交汇的新起点上,中国制造业将背…...
C++ 容器(二)——容器操作
一、容器的修改 容器修改函数 insert():在指定位置插入一个或多个元素erase():删除指定位置或指定范围的元素push_back():将元素添加到容器的末尾pop_back():删除容器的最后一个元素 push_front():将元素添加到容器的开…...

操作系统——进程控制
创建进程 fork fork是一个系统调用函数,用来创建子进程,通过多个执行流完成任务。子进程和父进程共用一份代码,子进程数据使用写时拷贝,即子进程数据在创建的时候和父进程相同,但是当要修改数据的时候,子进…...

Marin说PCB之国产电源芯片方案 ---STC2620Q
随着小米加入的造车大家庭,让这个本来就卷的要死的造车大家庭更加卷了。随之带来的蝴蝶效应就是江湖上各个造成门派都开始了降本方案的浪潮啊,开始打响价格战了。各家的新能源车企也是不得不开始启动了降本方案的计划了,为了应对降价的浪潮。…...
已解决java.lang.StringIndexOutOfBoundsException: 字符串索引越界异常的正确解决方法,亲测有效!!!
已解决java.lang.StringIndexOutOfBoundsException: 字符串索引越界异常的正确解决方法,亲测有效!!! 目录 问题分析 报错原因 解决思路 解决方法 检查索引范围 检查字符串长度 管理循环中的索引 总结 问题分析 java.lan…...
关于实体类注解@Data、@EqualsAndHashCode(callSuper = true)、@Accessors(chain = true)的作用
笔记:都是lombook插件的注解,作用是简化优化代码等,比如getter、setter,一般三者连用能避免一些如继承类的导致的一些坑,比如equal()方法的错误,具体用法可查阅每个注解及属性的作用。 Accessors(chain tr…...

5.9号模拟前端面试10问
5.9号模拟前端面试10问 1.html语义化的理解 HTML语义化是指使用具有明确含义的HTML标签来描述内容,而不仅仅是使用<div>和<span>等通用容器标签。语义化的HTML代码更易于阅读和维护,同时也有助于搜索引擎优化(SEO)。…...
vue3 JSX的使用与警告【JSX 元素隐式具有类型 “any“,因为不存在接口 “JSX.IntrinsicElements“】解决办法
一、安装 pnpm i vitejs/plugin-vue-jsx -D 二、配置 1、tsconfig.json "compilerOptions":{"jsx":"preserve" } 2、vite.config.ts import VueJsx from "vitejs/plugin-vue-jsx"...plugin:[vue(),VueJsx() ] 三、简单使用案例…...

一、计算机基础(Java零基础一)
🌻🌻目录 一、🌻🌻剖析学习Java前的疑问🌻🌻1.1 零基础学习编程1.2 英语不好能学吗?1.3 理解慢能学好吗?1.4 现在学Java晚吗?1.5 Java 和 Python 还有 Go 的选择1.6 Java…...

德国著名自动化公司Festo设计了一款仿生蜜蜂,仅重34g,支持多只蜜蜂编队飞行!...
德国著名的气动元件研发及自动化解决方案供应商Festo公司近日展示了一款仿生蜜蜂(BionicBee),重量只有34g,却完全可以实现自主飞行,还支持多只相同的蜜蜂机器人编队飞行。 BionicBee 重约 34 克,长 22 厘米…...
折腾记:C++用开源库Snap7通过S7协议连接西门子PLC
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 不是教程,是避坑指…...

Android studio 新版本 NewUI toolbar显示快捷按钮
新版本的Android studio 启用新的界面,以前许多快捷按键位置有变化 文章目录 设置始终显示主菜单设置ToolBar快捷按钮显示设置右下角显示分支 设置始终显示主菜单 原本要点击左上角几个横向才显示的菜单 设置始终显示,View -> Appearance -> Mai…...
辛普森公式求函数的近似积分【通用计算】
利用辛普森公式可以近似求出复杂函数的积分值,公式如下: ∫ a b f ( x ) d x ≈ h 3 [ y 0 y 2 n − 1 4 ( ∑ i 1 n − 1 y 2 i − 1 ) ∑ i 1 n − 1 y 2 i ] \int_{a}^{b} f(x) dx \approx \frac{h}{3}\left[ y_0 y_{2n-1} 4(\sum\limits_{i1…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...