《21天学通C++》(第二十章)STL映射类(map和multimap)

news2024/11/18 14:37:43

为什么需要mapmultimap
1.查找高效: 映射类允许通过键快速查找对应的值,这对于需要频繁查找特定元素的场景非常适合。
2.自动排序: 会自动根据键的顺序对元素进行排序
3.多级映射: 映射类可以嵌套使用,创建多级映射,这对于复杂的数据结构非常有用
4.键值对存储: 映射类专门设计用于存储键值对(key-value)
在这里插入图片描述

mapmultimap 之间的区别在于,后者能够存储重复的键,而前者只能存储唯一的键,要使用需要包含头文件<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::string
    std::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::map
    map<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"));


    //删除键为2
    myMultimap.erase(2);
    //删除键为1的元素
    myMultimap.erase(myMultimap.find(1));//只能删除one,而ONE删不掉
    //删除键3和键4
    auto 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::map
    std::map<int, std::string, CustomCompare> myMap;
    // 使用自定义比较函数的std::multimap
    std::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>,有以下特点

  1. 因为散列表的特性,理想情况下性能更高,最坏情况下性能更差
  2. 无序性

基本操作

#include <unordered_map>
#include <iostream>
#include <string>

int main() {
    // 使用整数作为键,字符串作为值的unordered_map
    std::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_multimap
    std::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;
}

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

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

相关文章

java.net.SocketInputStream.socketRead0 卡死导致 tomcat 线程池打满的问题

0 TL;DR; 问题与原因&#xff1a;某些特定条件下 java.net.SocketInputStream.socketRead0 方法会卡死&#xff0c;导致运行线程一直被占用导致泄露采用的方案&#xff1a;使用监控线程异步监控卡死事件&#xff0c;如果发生直接关闭网络连接释放链接以及对应的线程 1. 问题 …

贪心算法--将数组和减半的最小操作数

本题是力扣2208---点击跳转题目 思路&#xff1a; 要尽快的把数组和减小&#xff0c;那么每次挑出数组中最大的元素减半即可&#xff0c;由于每次都是找出最值元素&#xff0c;可以用优先队列来存储这些数组元素 每次取出最值&#xff0c;减半后再放入优先队列中&#xff0c;操…

最新:Lodash 严重安全漏洞背后你不得不知道的 JavaScript 知识

可能有信息敏感的同学已经了解到&#xff1a;Lodash 库爆出严重安全漏洞&#xff0c;波及 400万 项目。这个漏洞使得 lodash “连夜”发版以解决潜在问题&#xff0c;并强烈建议开发者升级版本。 我们在忙着“看热闹”或者“”升级版本”的同时&#xff0c;静下心来想&#xf…

如何通过代理IP实现搜索引擎优化

目录 前言 一、代理IP的基本概念 二、通过代理IP访问其他地区的搜索引擎 三、对比不同地区搜索结果 结论 前言 搜索引擎优化&#xff08;Search Engine Optimization&#xff0c;SEO&#xff09;是指通过优化网站的结构、内容和关键词等因素&#xff0c;提高网站在搜索引…

ubuntu挂载固态硬盘

ubuntu挂载固态硬盘 两种情况 包装盒拆出来的新硬盘用过的需要后处理的硬盘 新硬盘 一、确认硬盘设备 插上主机后输入 lsblk检查是否识别到你插入的硬盘 可以看到上图的nvme0n1是我挂载的硬盘&#xff08;目前已经挂载完成并映射到 ~/ssd目录&#xff09;&#xff0c;nvm…

如果你这样使用电路仿真软件,你就无敌了!

在电子设计领域&#xff0c;电路仿真软件如同一把锋利的宝剑&#xff0c;掌握它&#xff0c;你就能在复杂的电子世界中游刃有余。今天&#xff0c;就让我们一起探讨如何高效利用电路仿真软件&#xff0c;让你在电子设计领域所向披靡&#xff01; 一、熟悉软件界面与基础操作 …

点击短信链接唤起Android App实战

一.概述 在很多业务场景中,需要点击短信链接跳转到App的指定页面。在Android系统中,想要实现这个功能,可以通过DeepLink或AppLink实现。二.方案 2.1 DeepLink 2.1.1 方案效果 DeepLink是Android系统最基础、最普遍、最广泛的外部唤起App的方式,不受系统版本限制。当用户…

基于Vue3与ElementUI Plus的酷企秀场景可视化DIY设计器:前端技术引领下的数字化展示新篇章

一、引言 在当今信息化高速发展的时代&#xff0c;企业对于展示自身形象、提升用户体验以及增强品牌知名度的需求日益迫切。针对这一市场需求&#xff0c;我们推出了基于Vue3与ElementUI Plus的酷企秀场景可视化DIY设计器。该产品不仅具备电子画册、VR全景、地图秀三大核心功能…

2024年自动驾驶、车辆工程与智能交通国际会议(ICADVEIT2024)

2024年自动驾驶、车辆工程与智能交通国际会议&#xff08;ICADVEIT2024&#xff09; 会议简介 2024年自动驾驶、车辆工程和智能交通国际会议&#xff08;ICADVEIT 2024&#xff09;将在中国深圳举行。会议主要聚焦自动驾驶、车辆工程和智能交通等研究领域&#xff0c;旨在为从…

pytest教程-42-钩子函数-pytest_runtest_makereport

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_runtest_teardown钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_runtest_makereport钩子函数的使用方法。 pytest_runtest_makereport 钩子函数在 pytest 为每个测试生成报…

使用HashMap实现,对一个字符集进行哈夫曼编码

最终达到的效果: 调用一个类 class HuffmanCodin{.....} 使用类中的静态方法&#xff0c;获取哈夫曼编码&#xff1a; 事前准备——哈夫曼树的节点定义 class Node implements Comparable<Node> {int weight;//权重Node left;Node right;char ch;//关键字&#xff0c…

Zabbix5.0——安装与部署

目录 一、zabbix-server(192.168.206.134) 监控方 1. 环境准备 2.安装zabbix 2.1 准备zabbix-repo 2.2清理缓存 2.3安装zabbix主包&#xff08;服务器和代理&#xff09; 2.4安装zabbix前端包 3. 数据库安装 3.1 授权zabbix账号 3.2导入数据库&#xff08;初始化zabbix&#x…

切实有效的提高VMWARE游戏性能-各版本通杀 vm17pro

这里的游戏性能&#xff0c;当然了&#xff0c;特别指出的是3D性能&#xff0c;毕竟现在2D也很少了。 因为平时没啥事&#xff0c;所以&#xff0c;无聊就跟朋友挂挂游戏&#xff0c;没事写点代码折腾下。所以&#xff0c;免不了跟VMWARE搭上边。走了很多的弯路&#xff0c;中…

Linux-信号执行

1. 信号什么时候被处理 当进程从内核态返回到用户态的时候&#xff0c;进行信号的检测和处理 什么内核态&#xff0c;什么又是用户态呢&#xff1f; 当进程在CPU上运行时&#xff0c;内核态&#xff1a;允许进程访问操作系统的代码和数据&#xff0c;用户态&#xff1a;进程只…

Kubernetes容器技术详解

kubernetes Kubernetes&#xff08;K8s&#xff09;由Google打造&#xff0c;是一款功能强大、灵活可扩展的容器编排平台&#xff0c;引领云原生技术潮流。 Kubernetes主要解决以下4大点&#xff1a; 1.自动化运维平台 如下图所示&#xff1a; Kubernetes携手Docker&#xf…

【go项目01_学习记录08】

学习记录 1 模板文件1.1 articlesStoreHandler() 使用模板文件1.2 统一模板 1 模板文件 重构 articlesCreateHandler() 和 articlesStoreHandler() 函数&#xff0c;将 HTML 抽离并放置于独立的模板文件中。 1.1 articlesStoreHandler() 使用模板文件 . . . func articlesSt…

【动态规划】:路径问题_地下城游戏

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本专栏是关于各种算法的解析&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构专栏&…

怎么用AI软件设计字体

一 工具准备 软件&#xff1a;Adobe illustrator 如下网盘自取 链接&#xff1a;https://pan.baidu.com/s/1hlImpN4QlsSkOLLUxINOGA 提取码&#xff1a;love 安装的时候看不全界面&#xff0c;多按几下tab键就能看到按钮。 直接找一款喜欢的字体修改&#xff0c;字体包如下…

PyCharm安装教程(超详细图文教程)

一、下载和安装 1.进入PyCharm官方下载&#xff0c;官网下载地址&#xff1a; https://www.jetbrains.com/pycharm/download/ 专业版安装插件放网盘了&#xff0c;网盘下载即可&#xff1a;itcxy.xyz/229.html2.安装 1.下载后找到PyCharm安装包&#xff0c;然后双击双击.ex…

【连连国际注册_登录安全分析报告】

连连国际注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨…