c++ map/multimap容器 学习笔记

news2025/2/1 11:55:10

1 map的基本概念

简介:

map中所有的元素都是pair
pair中第一个元素是key(键),第二个元素是value(值)
所有元素都会根据元素的键值自动排序。

本质:

map/multimap 属于关联式容器,底层是用红黑树实现。

优点:

可以根据key值快速查找数据

map 和multimap 的区别:

map不允许key重复,而multimap允许key重复

2 map的构造和赋值

构造函数

map<T1, T2> mapT; // 默认构造函数
map(const map &st); // 拷贝构造函数

赋值

map& operator=(const map &st); // 重载等号操作符
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

//  map的构造和赋值

void printMap(map<string,int> &m) {
    for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
        cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<string,int> m;
    m.insert(pair<string,int>("貂蝉",18));
    m.insert(pair<string,int>("小乔",19));
    m.insert(pair<string,int>("孙尚香",17));
    m.insert(pair<string,int>("甄姬",16));
    m.insert(pair<string,int>("西施",20));
    printMap(m);

    // 拷贝构造函数
    map<string,int> m2(m);
    printMap(m2);

    // 赋值操作
    map<string,int> m3;
    m3 = m;
    printMap(m3);

}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}


3. map 大小和交换

函数原型:

size(); // 返回 map 中元素的个数
empty(); // 判断 map 是否为空
swap(map x); // 将 x 和当前 map 中的元素进行互换
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

//   map 大小和交换

void printMap(map<string,int> &m) {
    for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
        cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<string,int> m;
    m.insert(pair<string,int>("貂蝉",18));
    m.insert(pair<string,int>("小乔",19));
    m.insert(pair<string,int>("孙尚香",17));
    m.insert(pair<string,int>("甄姬",16));
    m.insert(pair<string,int>("西施",20));

    cout << "map 大小:" << m.size() << endl;
    if (m.empty())
    {
        cout << "map 为空" << endl;
    }
    else{
        cout << "map 不为空" << endl;
    }

    map<string,int> m2;
    m2.insert(pair<string,int>("妲己",21));
    m2.insert(pair<string,int>("王昭君",20));
    m2.insert(pair<string,int>("杨玉环",18));

    cout << "交换前:" << endl;
    printMap(m);
    printMap(m2);

    cout << "交换后:" << endl;
    m.swap(m2);
    printMap(m);
    printMap(m2);
}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}


4.map 插入和删除

函数原型:

inserrt(elem) // 在容器中插入元素
clear() // 删除所有元素
erase(pos) // 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end) // 删除迭代器从beg到end的所有元素
erase(key) // 删除key所指的元素
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

//   map 插入和删除


void printMap(map<string,int> &m) {
    for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
        cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<string,int> m;
    // 第一种插入方式
    m.insert(pair<string,int>("貂蝉",18));
    // 第二种插入方式
    m.insert(make_pair("小乔",19));
    // 第三种插入方式
    m.insert(map<string,int>::value_type("孙尚香",17));
    // 第四种插入方式
    m["甄姬"] = 16;
    m.insert(pair<string,int>("西施",20));

    // []不建议插入,如果key存在,则修改value,如果key不存在,则插入pair
    // 可以用[]来访问value
    cout << m["甄姬"] << endl;
    printMap(m);

    // 删除
    m.erase(m.begin());
    printMap(m);

    m.erase("甄姬"); // 删除key为甄姬的元素
    printMap(m);

    m.erase(m.begin(),m.end()); // 删除迭代器区间[begin,end)的元素 相当于清空
    printMap(m);

    
}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}


5. map查找和统计

函数原型:

map<T1,T2>::find(key); // 查找key,如果查到,返回该键的元素的迭代器;如果查不到,返回map.end();
map<T1,T2>::count(key); // 查找key,如果查到,返回1;如果查不到,返回0;
#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

//   map查找和统计

void printMap(map<string,int> &m) {
    for(map<string,int>::iterator it = m.begin();it!=m.end();it++) {
        cout << "姓名:" << it->first << " 年龄:" << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<string,int> m;
    // 第一种插入方式
    m.insert(pair<string,int>("貂蝉",18));
    // 第二种插入方式
    m.insert(make_pair("小乔",19));
    // 第三种插入方式
    m.insert(map<string,int>::value_type("孙尚香",17));
    // 第四种插入方式
    m["甄姬"] = 16;
    m.insert(pair<string,int>("西施",20));

    map<string,int>::iterator pos = m.find("小乔");
    if(pos != m.end()) {
        cout << "找到了小乔,年龄为:" << pos->second << endl;
    }
    else {
        cout << "未找到小乔" << endl;
    }

    cout << "num  " << m.count("小乔") << endl;

    
}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}


6. map容器的排序

利用防函数可以改变排序规则

#include <iostream>
#include <fstream>
#include <string>
#include <map>
using namespace std;

// map容器的排序

class MyCompare {
public:
    bool operator()(int v1,int v2) const {
        return v1 > v2;
    }
};

void printMap(map<int,string,MyCompare> &m) {
    for(map<int,string,MyCompare>::iterator it = m.begin();it!=m.end();it++) {
        cout << "id: " << it->first << " 名字: " << it->second << endl;
    }
    cout << endl;
}

void test01() {
    map<int,string,MyCompare> m;
    m.insert(make_pair(1,"西施"));
    m.insert(make_pair(2,"貂蝉"));
    m.insert(make_pair(3,"王昭君"));
    m.insert(make_pair(4,"杨玉环"));
    m.insert(make_pair(5,"杨贵妃"));
    printMap(m);
    
}


int main(int argc, char const *argv[]) {
    test01();
    return 0;
}


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

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

相关文章

安卓逆向之脱壳-认识一下动态加载 双亲委派(一)

安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳&#xff08;unpacking&#xff09;指的是去除应用程序中加固或保护措施的过程&#xff0c;使得可以访问应用程序的原始代码或者数据。脱壳的重要性&#xff1a; 分析恶意软件&#xff1a;很多恶意软件…

马尔科夫模型和隐马尔科夫模型区别

我用一个天气预报和海藻湿度观测的比喻来解释&#xff0c;保证你秒懂&#xff01; 1. 马尔可夫模型&#xff08;Markov Model, MM&#xff09; 特点&#xff1a;状态直接可见 场景&#xff1a;天气预报&#xff08;晴天→雨天→阴天…&#xff09;核心假设&#xff1a; 下一个…

Python NumPy(7):连接数组、分割数组、数组元素的添加与删除

1 连接数组 函数描述concatenate连接沿现有轴的数组序列stack沿着新的轴加入一系列数组。hstack水平堆叠序列中的数组&#xff08;列方向&#xff09;vstack竖直堆叠序列中的数组&#xff08;行方向&#xff09; 1.1 numpy.concatenate numpy.concatenate 函数用于沿指定轴连…

【LLM】deepseek多模态之Janus-Pro和JanusFlow框架

note 文章目录 note一、Janus-Pro&#xff1a;解耦视觉编码&#xff0c;实现多模态高效统一技术亮点模型细节 二、JanusFlow&#xff1a;融合生成流与语言模型&#xff0c;重新定义多模态技术亮点模型细节 Reference 一、Janus-Pro&#xff1a;解耦视觉编码&#xff0c;实现多模…

2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据

2000-2021年 全国各地级市专利申请与获得情况、绿色专利申请与获得情况数据.ziphttps://download.csdn.net/download/2401_84585615/89575931 https://download.csdn.net/download/2401_84585615/89575931 2000至2021年&#xff0c;全国各地级市的专利申请与获得情况呈现出显著…

51单片机(STC89C52)开发:点亮一个小灯

软件安装&#xff1a; 安装开发板CH340驱动。 安装KEILC51开发软件&#xff1a;C51V901.exe。 下载软件&#xff1a;PZ-ISP.exe 创建项目&#xff1a; 新建main.c 将main.c加入至项目中&#xff1a; main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…

240. 搜索二维矩阵||

参考题解&#xff1a;https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/2361487/240-sou-suo-er-wei-ju-zhen-iitan-xin-qin-7mtf 将矩阵旋转45度&#xff0c;可以看作一个二叉搜索树。 假设以左下角元素为根结点&#xff0c; 当target比root大的时候&#xff…

反向代理模块b

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

EasyExcel使用详解

文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

vue3相关知识点

title: vue_1 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端vue3 Webpack ~ vite vue3是基于vite创建的 vite 更快一点 一些准备工作 准备后如图所示 插件 Main.ts // 引入createApp用于创建应用 import {createApp} from vue // 引入App根组件 import App f…

微服务网关鉴权之sa-token

目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…

华为小米vivo向上,苹果荣耀OPPO向下

日前&#xff0c;Counterpoint发布的手机销量月度报告显示&#xff0c;中国智能手机销量在2024年第四季度同比下降3.2%&#xff0c;成为2024年唯一出现同比下滑的季度。而对于各大智能手机品牌来说&#xff0c;他们的市场份额和格局也在悄然发生变化。 华为逆势向上 在2024年第…

国产编辑器EverEdit - 输出窗口

1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果&#xff0c;主要包括&#xff1a; 查找类&#xff1a;查找全部&#xff0c;筛选等待操作&#xff0c;可以把查找结果打印到输出窗口中&#xff1b; 程序类&#xff1a;在执行外部程序时(如&#xff1a;命令窗…

获取snmp oid的小方法1(随手记)

snmpwalk遍历设备的mib # snmpwalk -v <SNMP version> -c <community-id> <IP> . snmpwalk -v 2c -c test 192.168.100.201 .根据获取的值&#xff0c;找到某一个想要的值的oid # SNMPv2-MIB::sysName.0 STRING: test1 [rootzabbix01 fonts]# snmpwalk -v…

望获实时Linux系统:2024回顾与2025展望

2024年回顾 功能安全认证 2024年4月&#xff0c;望获操作系统V2获ISO26262:2018功能安全产品认证&#xff08;ASIL B等级&#xff09;&#xff0c;达到国际功能安全标准。 EtherCAT实时性增强 2024年5月&#xff0c;发布通信实时增强组件&#xff0c;EtherCAT总线通信抖…

2025_1_29 C语言学习中关于指针

1. 指针 指针就是存储的变量的地址&#xff0c;指针变量就是指针的变量。 1.1 空指针 当定义一个指针没有明确指向内容时&#xff0c;就可以将他设置为空指针 int* p NULL;这样对空指针的操作就会使程序崩溃而不会导致出现未定义行为&#xff0c;因为程序崩溃是宏观的&…

SQL注入漏洞之高阶手法 宽字节注入以及编码解释 以及堆叠注入原理说明

目录 宽字节注入 编码区分 原理 函数 转译符号解释 注意 绕过方式详解 堆叠【Stack】注入攻击 注入语句 宽字节注入 在说宽字节注入之前 我们需要知道编码相关的知识点&#xff0c;这个有助于搞定什么是宽字节注入 分清楚是ascii码是什么宽字节注入代码里面加入了adds…

ADC 精度 第一部分:精度与分辨率是否不同?

在与使用模数转换器&#xff08;ADC&#xff09;的系统设计师交谈时&#xff0c;我经常听到的一个最常见问题是&#xff1a; “你们的16位ADC也是16位准确的吗&#xff1f;” 这个问题的答案在于对分辨率和精度这两个概念的基本理解存在差异。尽管这是两个完全不同的概念&…