C++STL---<map>

C++的map库作为STL标准模板库中的有序关联容器,主要用于存储和管理唯一键值对数据集合。其核心功能是通过红黑树结构自动维护键的有序性(默认升序排列),提供O(log n)时间复杂度的元素查找、插入和删除操作,支持键的唯一性约束及自定义排序规则。该容器提供键值对的快速检索(find/count)、动态更新(operator[])、范围查询(lower_bound/upper_bound)等接口,适用于需要按键有序遍历或范围操作的场景(如字典管理、事件调度系统),但相比基于哈希表的unordered_map在插入效率上略低,以换取稳定的排序特性。


1. 基本概念

特点

  • 有序性std::map中的元素按键值的升序(默认)或自定义顺序存储。
  • 唯一键std::map中每个键是唯一的,不能重复。
  • 自动排序:插入元素时会根据键值自动排序。
  • 时间复杂度:查找、插入和删除操作的时间复杂度为 (O(\log n)),因为底层实现是平衡二叉树。

头文件

#include <map>

模板定义

template<class Key,             // 键类型class T,               // 值类型class Compare = std::less<Key>,  // 比较函数对象,默认按升序排序class Allocator = std::allocator<std::pair<const Key, T>> // 内存分配器
> class map;

2. 常用成员函数

构造函数

  1. 默认构造函数
    std::map<int, std::string> m;
    
  2. 范围构造函数
    std::vector<std::pair<int, std::string>> vec = {{1, "A"}, {2, "B"}};
    std::map<int, std::string> m(vec.begin(), vec.end());
    
  3. 拷贝构造函数
    std::map<int, std::string> m1 = m;
    
  4. 移动构造函数
    std::map<int, std::string> m2 = std::move(m1);
    

插入操作

  1. 单个元素插入
    std::map<int, std::string> m;
    m.insert({1, "A"}); // 返回 std::pair<iterator, bool>
    
  2. 使用下标操作符插入
    m[2] = "B"; // 如果键不存在,会创建新元素
    
  3. 范围插入
    std::vector<std::pair<int, std::string>> vec = {{3, "C"}, {4, "D"}};
    m.insert(vec.begin(), vec.end());
    
  4. 使用emplace插入
    m.emplace(5, "E"); // 更高效,避免额外的拷贝
    

删除操作

  1. 按键删除
    m.erase(1); // 删除键为1的元素
    
  2. 按迭代器删除
    auto it = m.find(2);
    if (it != m.end()) {m.erase(it);
    }
    
  3. 范围删除
    m.erase(m.begin(), m.find(4)); // 删除键小于4的元素
    

查找操作

  1. find
    auto it = m.find(3); // 返回指向键为3的迭代器或 m.end()
    
  2. count
    if (m.count(3)) {std::cout << "Key 3 exists.\n";
    }
    
  3. lower_boundupper_bound
    • lower_bound:返回第一个不小于指定键的迭代器。
    • upper_bound:返回第一个大于指定键的迭代器。
    auto it1 = m.lower_bound(3);
    auto it2 = m.upper_bound(3);
    
  4. equal_range
    auto range = m.equal_range(3); // 返回一个范围 [lower_bound, upper_bound)
    

访问操作

  1. 通过下标访问
    std::cout << m[3]; // 如果键不存在,会插入一个默认值
    
  2. 通过at访问
    std::cout << m.at(3); // 如果键不存在,会抛出异常
    

容量操作

  1. empty
    if (m.empty()) {std::cout << "Map is empty.\n";
    }
    
  2. size
    std::cout << "Size: " << m.size();
    
  3. max_size
    std::cout << "Max size: " << m.max_size();
    

迭代器

  1. 正向迭代器
    for (auto it = m.begin(); it != m.end(); ++it) {std::cout << it->first << ": " << it->second << "\n";
    }
    
  2. 反向迭代器
    for (auto it = m.rbegin(); it != m.rend(); ++it) {std::cout << it->first << ": " << it->second << "\n";
    }
    

观察器

  1. key_comp
    返回用于比较键的函数对象。
    auto comp = m.key_comp();
    if (comp(1, 2)) {std::cout << "1 is less than 2.\n";
    }
    
  2. value_comp
    返回用于比较键值对的函数对象。
    auto comp = m.value_comp();
    if (comp({1, "A"}, {2, "B"})) {std::cout << "First pair is smaller.\n";
    }
    

交换和清空

  1. swap
    std::map<int, std::string> m1, m2;
    m1.swap(m2);
    
  2. clear
    m.clear();
    

3. 自定义排序

可以通过第三个模板参数Compare自定义排序规则。例如:

struct CustomCompare {bool operator()(const int& a, const int& b) const {return a > b; // 降序}
};std::map<int, std::string, CustomCompare> m;

4. 注意事项

  1. 效率问题
    • std::map适用于需要频繁查找、插入和删除的场景,但如果只需要按键值存储,可以考虑std::unordered_map,其查找复杂度为 (O(1))。
  2. 下标操作符的副作用
    • 使用m[key]访问不存在的键时,会插入一个默认值。
  3. 迭代器失效
    • 插入操作不会使迭代器失效。
    • 删除操作会使指向被删除元素的迭代器失效。

5. 应用场景

  • 存储键值对数据,例如字典、配置项等。
  • 实现有序的查找表。
  • 需要按键排序的场景。

我的追求是做一个完整的人,一个结合了完美与不完美的人。 ​ —黛比·福特

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

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

相关文章

解决git clone下载慢或者超时问题

在网上找了很多办法&#xff0c;直接最简单的使用镜像网站下载。 国内可用的镜像网站有&#xff1a; https://github.com.cnpmjs.org # 服务器位于香港https://gitclone.com # 服务器位于杭州https://doc.fastgit.org # 服务器位于香港 例如&#xff1a;将 git clone https:…

SQL 全面指南:从基础语法到高级查询与权限控制

SQL&#xff1a;全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一标准 。 一、SQL通用语法 在学习具体的SQL语句之前&#xff0c;先来了解一下SQL语言的同于语法。 1). SQL语句可以单行或多…

【AD】4-8 AD集成库的创建与安装

集成库&#xff1a;集成好元件信息、元件原理图库、PCB封装库、3D模型等的元件库&#xff0c;直接调用器件不可修改。 AD集成库创建 1.文件—新的—库&#xff0c;选择库工程&#xff0c;右键保存 2.将原理图库和PCB封装库复制到创建的集成库文件夹&#xff0c;并右键单击库工…

【大模型学习笔记】0基础本地部署dify教程

目录 一、准备工作1、安装包下载1.1 安装git1.2 安装docker&#xff08;1&#xff09;默认安装&#xff08;2&#xff09;自定义路径安装(推荐)1.3 验证docker1.4 切换镜像源 二、下载dify源码三、启动dify1、在docker目录下启动dify2、验证3、浏览器中输入 一、准备工作 本地…

unity pico开发 五 UI交互

文章目录 添加画布添加交互组件取消传送射线对UI的控制解决按扳机键会传送的冲突按下按键呼出菜单&#xff0c;并让菜单出现在头的前方 添加画布 创建一个新画布&#xff0c;添加一个Button&#xff0c;将画布改为world space&#xff0c;然后缩放改为0.001&#xff0c;调整到…

上海公共数据授权运营实践详解(政策制度、运营模式、运营平台、运营成果、场景案例)

近期&#xff0c;国家公共数据资源登记平台正式上线&#xff0c;将进一步推动公共数据授权运营加速推动。本期分享&#xff1a;上海市公共数据授权运营实践&#xff0c;上海公共数据授权运营为统一集中授权&#xff0c;上海数据集团作为上海公共数据授权运营的唯一单位&#xf…

HTTP超文本传输协议

HTTP超文本传输协议 HTTP的基本原理HTTP请求的组成HTTP响应的组成HTTP请求方法HTTP状态码HTTP的无状态性和持久连接HTTPS&#xff08;HTTP Secure&#xff09;Cookie 和 SessionCookieSession对比 总结 HTTP&#xff08;超文本传输协议&#xff09;是一种用于从Web服务器传输超…

android TabLayout设置tab的时候文字默认居中,选中文字加粗

1、前言如题 TabLayout设置tab的时候文字默认居中&#xff0c;在TabLayout布局增加以上代码。 tab选中文字加粗&#xff0c;需要重写TabLayout的customview进行设置。 app:tabMaxWidth"0dp" app:tabGravity"fill" app:tabMode"fixed"

二叉树专题练习 ——基于罗勇军老师的《蓝桥杯算法入门C/C++》

目录 一、B3642 二叉树的遍历 - 洛谷 算法代码&#xff1a; 1. 代码结构 头文件和命名空间&#xff1a; 常量定义&#xff1a; 结构体定义&#xff1a; 前序遍历函数&#xff1a; 中序遍历函数&#xff1a; 后序遍历函数&#xff1a; 主函数&#xff1a; 2. 代码思路…

健康饮食,健康早餐

营养早餐最好包含4大类食物&#xff1a;谷薯类&#xff1b;碳水&#xff1b;蛋白质&#xff1b;膳食纤维。 1.优质碳水 作用&#xff1a;提供持久的能量&#xff0c;避免血糖大幅波动等 例如&#xff1a;全麦面包、红薯&#x1f360;、玉米&#x1f33d;、土豆&#x1f954;、…

使用Linux服务器搭建。

前言&#xff1a; 本文将简述如何使用vmware模拟Linux搭建服务器环境。并配置相关安全措施。 本文工具&#xff1a; Centos Stream 9 图文详细安装记录_centos9安装教程详解-CSDN博客 xshell&#xff0c;服务器远程连接工具。 https://old.xp.cn/linux.html#install-show …

Artec Leo+Ray II 三维扫描仪成功为VR展数字化30吨重设备-沪敖3D

挑战&#xff1a;在贸易展上展示重达30吨的机械设备&#xff0c;同时克服设备搬运和展示的难题&#xff0c;减轻物流负担。。 解决方案&#xff1a;Artec Leo、Artec Ray II、Artec Studio、Blender、Unity、Microsoft HoloLens、HTC VIVE PRO 效果&#xff1a;在虚拟展厅中&am…

期权帮|如何判断股指期货市场是否值得做空呢?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 如何判断股指期货市场是否值得做空呢&#xff1f; 如果你觉得市场下跌的可能性较大&#xff0c;那么就可以考虑做空股指期货。但记住&#xff0c;做空有风险&#xff0c;操作需…

qt实践教学(编写一个代码生成工具)持续更新至完成———

前言&#xff1a; 我的想法是搭建一个和STM32cubemux类似的图形化代码生成工具&#xff0c;可以把我平时用到的代码整合一下全部放入这个软件中&#xff0c;做一个我自己专门的代码生成工具&#xff0c;我初步的想法是在下拉选框中拉取需要配置的功能&#xff0c;然后就弹出对…

操作系统:计算机架构里的幕后指挥官

Linxu系列 文章目录 Linxu系列前言一、操作系统的概念二、操作系统的工作原理三、操作系统对软硬件资源的管理总结 前言 在上篇博客中&#xff0c;我们介绍了冯诺依曼体系&#xff0c;&#xff0c;但是冯诺依曼体系结构出现的都是硬件设备&#xff0c;难道需要用户去操作、管理…

DNS 详细过程 与 ICMP

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; DNS (Domain Name System) 快速了解&#x1f98b; DNS 背景&#x1f98b; 域名简介&#x1f98b; 真实地址查询 —— DNS&#x1f380; 域名的层级关系&am…

【C/C++算法】从浅到深学习--- 位操作算法(图文兼备 + 源码详解)

绪论&#xff1a;冲击蓝桥杯一起加油&#xff01;&#xff01; 每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 今天总结了下位操作中常见的使用的方法&#xff0c;并且附加许多训练&#xff0c;通过…

【每日八股】计算机网络篇(二):TCP 和 UDP

目录 TCP 的头部结构&#xff1f;TCP 如何保证可靠传输&#xff1f;1. 确认应答机制2. 超时重传3. 数据排序与去重4. 流量控制5. 拥塞控制6. 校验和 TCP 的三次握手&#xff1f;第一次握手第二次握手第三次握手 TCP 为什么要三次握手&#xff1f;问题一&#xff1a;防止历史连接…

Tomcat-web服务器介绍以及安装部署

一、Tomcat简介 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用…

【通俗讲解电子电路】——从零开始理解生活中的电路(三)

实际应用案例&#xff1a;生活中的电子电路 ——拆解你身边的“隐形工程师” 1. 手电筒电路&#xff1a;最简单的直流系统 电路组成 电源&#xff1a;2节1.5V电池&#xff08;串联3V&#xff09;。 开关&#xff1a;按钮控制回路通断。 LED&#xff1a;发光二极管&#xff…