详解map与multimap容器

目录

一、map简介

1.map构成

2.map本质

3.map的优点

4.map和multimap区别:map不允许容器中有重复key值元素。multimap允许容器中有重复key值元素。

5.map的构建

6.map的赋值

1️⃣赋值法

2️⃣拷贝赋值法

7.map的成员函数

(1)insert函数

(2)erase函数

(3)清空clear函数

(4)返回容器大小函数

(5)判断map容器是否为空的函数

(6)map的交换swap函数

(7)map的查找函数

8.map的统计count函数

9.map的排序函数

② 利用仿函数可以指定map容器的排序规则。

如果想用sort:

​编辑10.lower_bound()函数

multimap 看这个,其实没有特别大的区别                        原文链接:https://blog.csdn.net/weixin_45826022/article/details/102892952


一、map简介

1.map构成

        map中所有元素都是pair:pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
所有元素都会根据元素的键值自动排序

2.map本质

        map、multimap属于关联式容器,底层结构是二叉树实现的。

3.map的优点

        可以根据key值快速找到value。

4.map和multimap区别
map不允许容器中有重复key值元素。
multimap允许容器中有重复key值元素。

5.map的构建

必须要加头文件#include <map>

map<Typedata,Typedata> mp;

6.map的赋值

1️⃣赋值法

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;int main(void){map<int,int> mp;mp[1]=2;mp[3]=4;for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}return 0;
}

2️⃣拷贝赋值法

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;int main(void){cout<<"直接赋值法"<<endl; map<int,int> mp;mp[1]=2;mp[3]=4;for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}cout<<"--------------------"<<endl; cout<<"拷贝赋值法的两个方法"<<endl; map<int,int> m(mp);for(auto i=m.begin();i!=m.end();i++){cout<<i->first<<" "<<i->second<<endl;}cout<<"--------------------"<<endl; map<int,int> p;p=m;for(auto i=p.begin();i!=p.end();i++){cout<<i->first<<" "<<i->second<<endl;}cout<<"--------------------"<<endl; return 0;
}

7.map的成员函数

(1)insert函数

函数原型:insert(elem);    //在容器中插入元素。
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;//创建对组并插入map容器的四种方式m1.insert(pair<int, int>(1, 123));m1.insert(make_pair(2, 20));m1.insert(map<int, int>::value_type(3, 30));m1[4] = 40;     //可以利用key访问到相对应的valuePrintMap(m1);return 0;
}

运行结果:

(2)erase函数

函数原型:erase(pos);      //删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(key);      //删除容器中值为key的元素。
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;//创建对组并插入map容器的四种方式m1.insert(pair<int, int>(1, 123));m1.insert(pair<int, int>(2, 456));m1.insert(pair<int, int>(3, 789));m1.insert(pair<int, int>(4, 1000));PrintMap(m1);cout<<"第一次删除"<<endl; m1.erase(m1.begin());	//删除m1.begin()迭代器指向的数 PrintMap(m1);cout<<"第二次删除"<<endl; m1.erase(3);  //删除key==3的数 PrintMap(m1);cout<<"第三次删除"<<endl; m1.erase(m1.begin(), m1.end());		//删除[m1.begin(),m1.end())区间的值 PrintMap(m1); return 0;
}

运行结果:

(3)清空clear函数

函数原型:clear();         //清除所有元素

(4)返回容器大小函数

函数原型:size();      //返回容器中元素的数目
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;//创建对组并插入map容器的四种方式m1.insert(pair<int, int>(1, 123));m1.insert(pair<int, int>(2, 456));m1.insert(pair<int, int>(3, 789));m1.insert(pair<int, int>(4, 1000));PrintMap(m1);cout<<m1.size()<<endl;return 0;
}

运行结果:

(5)判断map容器是否为空的函数

函数原型:empty();     //判断容器是否为空
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;//创建对组并插入map容器的四种方式m1.insert(pair<int, int>(1, 123));m1.insert(pair<int, int>(2, 456));m1.insert(pair<int, int>(3, 789));m1.insert(pair<int, int>(4, 1000));PrintMap(m1);if(m1.empty()){cout<<"此容器为空"<<endl; }else{cout<<"此容器非空"<<endl;}return 0;
}

(6)map的交换swap函数

#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;m1.insert(pair<int, int>(1, 123));m1.insert(pair<int, int>(2, 456));m1.insert(pair<int, int>(3, 789));m1.insert(pair<int, int>(4, 1000));cout<<"交换前的m1的值"<<endl;PrintMap(m1);map<int, int> m2;m2.insert(pair<int, int>(123, 1));m2.insert(pair<int, int>(456, 2));m2.insert(pair<int, int>(789, 3));m2.insert(pair<int, int>(1000, 4));cout<<"交换前的m2的值"<<endl;PrintMap(m2);m1.swap(m2);cout<<"交换后的m1的值"<<endl;PrintMap(m1);cout<<"交换后的m2的值"<<endl; PrintMap(m2);return 0;
}

运行结果:

(7)map的查找函数

函数原型:find(key);   //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;m1.insert(pair<int, int>(1, 10));m1.insert(pair<int, int>(2, 20));m1.insert(pair<int, int>(2, 10));m1.insert(pair<int, int>(4, 30));m1.insert(pair<int, int>(5, 40));m1.insert(pair<int, int>(6, 50));PrintMap(m1);map<int, int>::iterator pos = m1.find(4);if (pos != m1.end()){//我想表达的是:这两种表达方式相同 pos->first与 (*pos).first cout << "查到了!key = " << pos->first << "\t Value = " << pos->second << endl;	cout << "查到了!key = " << (*pos).first << "\t Value = " << (*pos).second << endl;}else{cout << "未找到!" << endl;}return 0;
}

运行结果:

8.map的统计count函数

函数原型:count(key);  //统计key的元素个数
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} int main(void){map<int, int> m1;m1.insert(pair<int, int>(1, 10));m1.insert(pair<int, int>(2, 20));m1.insert(pair<int, int>(2, 10));m1.insert(pair<int, int>(4, 30));m1.insert(pair<int, int>(5, 40));m1.insert(pair<int, int>(6, 50));PrintMap(m1);//对于map容器而言,count()的结果非0即1,因为map容器不允许插入相同key值的对组cout << "一共有 " << m1.count(3) << " 个Key为3的数据" << endl;return 0;
}

运行结果:

9.map的排序函数

① map容器默认排序规则为按照key值进行从小到大排序,利用仿函数,可以改变排序规则。

② 利用仿函数可以指定map容器的排序规则。

③ 对于自定义数据类型,map必须要指定排序规则,同set容器。

class MyCompare
{
public:bool operator()(int v1, int v2){return v1 > v2;}
};
void Map_test05()
{map<int, int> m1;m1.insert(pair<int, int>(4, 40));m1.insert(pair<int, int>(5, 50));m1.insert(pair<int, int>(2, 20));m1.insert(pair<int, int>(1, 10));m1.insert(pair<int, int>(3, 30));PrintMap(m1);map<int, int, MyCompare> m2;m2.insert(pair<int, int>(4, 40));m2.insert(pair<int, int>(5, 50));m2.insert(pair<int, int>(2, 20));m2.insert(pair<int, int>(1, 10));m2.insert(pair<int, int>(3, 30));for (map<int, int, MyCompare>::iterator mit = m2.begin(); mit != m2.end(); mit++){cout << "Key = " << mit->first << " Vaule = " << mit->second << endl;}cout << endl;
}

运行结果:

如果想用sort:
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;void PrintMap(map<int,int> mp){for(auto i=mp.begin();i!=mp.end();i++){cout<<i->first<<" "<<i->second<<endl;}
} bool cmp(pair<int,int> a,pair<int,int> b){if(a.first!=b.first)return a.first>b.first;elsereturn a.second>b.second;
}int main(void){map<int, int> m1;m1.insert(pair<int, int>(1, 10));m1.insert(pair<int, int>(2, 20));m1.insert(pair<int, int>(2, 10));m1.insert(pair<int, int>(4, 30));m1.insert(pair<int, int>(5, 40));m1.insert(pair<int, int>(6, 50));PrintMap(m1);//排序后cout<<"排序后"<<endl; // 将map元素拷贝到vector中  vector<pair<int, int>> vec(m1.begin(), m1.end());  sort(vec.begin(),vec.end(),cmp);for(auto i=vec.begin();i!=vec.end();i++){cout<<i->first<<" "<<i->second<<endl;}return 0;
}

运行结果:

10.lower_bound()函数

        lower_bound() 函数返回一个迭代器,指向 std::map 中第一个键值大于或等于给定元素的位置。如果没有找到,返回指向 map 末尾的迭代器。

实例:

#include <iostream>
#include <map>  int main() {  std::map<int, std::string> myMap;  myMap.insert({1, "One"});  myMap.insert({2, "Two"});  myMap.insert({3, "Three"});  myMap.insert({5, "Five"});  myMap.insert({7, "Seven"});  // 使用 lower_bound 查找  int keyToFind = 4; // 查找 >= 4 的第一个键  auto it = myMap.lower_bound(keyToFind);  // 输出结果  if (it != myMap.end()) {  std::cout << "The first key >= " << keyToFind << " is: " << it->first << ", Value: " << it->second << "\n";  } else {  std::cout << "No key >= " << keyToFind << " found in the map.\n";  }   return 0;
}

运行结果:

multimap 看这个,其实没有特别大的区别


                        
原文链接:https://blog.csdn.net/weixin_45826022/article/details/102892952

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

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

相关文章

PyAEDT:Ansys Electronics Desktop API 简介

在本文中&#xff0c;我将向您介绍 PyAEDT&#xff0c;这是一个 Python 库&#xff0c;旨在增强您对 Ansys Electronics Desktop 或 AEDT 的体验。PyAEDT 通过直接与 AEDT API 交互来简化脚本编写&#xff0c;从而允许在 Ansys 的电磁、热和机械求解器套件之间无缝集成。通过利…

ubuntu将firewall-config导出为.deb文件

firewall-config ubuntu是canonial 公司维护的&#xff0c;用wireshark测过&#xff0c;开机会给他们公司发遥测&#xff08;开了ufw阻塞所有连接也一样&#xff0c;canonial在里面把代码改了&#xff09;firewall-config是fedora(爱好者维护&#xff0c;公益版本)自带的防火墙…

LLMs之Code:Qwen2.5-Coder的简介、安装和使用方法、案例应用之详细攻略

LLMs之Code&#xff1a;Qwen2.5-Coder的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;这篇论文介绍了Qwen2.5-Coder系列模型&#xff0c;这是一个针对代码生成的强大开源大型语言模型。 >> 背景痛点&#xff1a;现有代码大型语言模型的不足&#xff1a;虽然…

H3C NX30Pro刷机教程-2024-11-16

H3C NX30Pro刷机教程-2024-11-16 ref: http://www.ttcoder.cn/index.php/2024/11/03/h3c-nx30pro亲测无需分区备份 路由器-新机初始化设置路由器登录密码telnet进入路由器后台 刷机上传uboot到路由器后台在Windows环境下解压后的软件包中打开 tftpd64.exe在NX30Pro环境下通过以…

FPGA使用Verilog实现CAN通信

FPGA实现CAN通信&#xff08;Verilog&#xff09; 1.作者使用的方法是通过FPGA芯片&#xff08;如Xilinx公司的型号为XC7K325TFFG676-2&#xff09;控制SJA1000T芯片&#xff08;CAN控制器芯片&#xff09;实现CAN通信&#xff0c;如下图所示&#xff1a; 2.熟悉连接方式之后&…

27-压力测试

测试目标 & 测试数据 ● 测试目标 ○ 测试集群的读写性能 / 做集群容量规划 ○ 对 ES 配置参数进行修改&#xff0c;评估优化效果 ○ 修改 Mapping 和 Setting&#xff0c;对数据建模进行优化&#xff0c;并测试评估性能改进 ○ 测试 ES 新版本&#xff0c;结合实际场…

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法&#xff1a; 注意事项&#xff1a; 2.集成测试 需注意事项&#xff1a; 实现集成测试的方法&#xff1a; 如何实现高效且可靠的集成测试&#xff1a; 3.系统测试 实现系统测试的方法: 须知注意事项&#xff1a; 4.验收测试 实现验…

vxe-grid table 校验指定行单元格的字段,只校验某个列的字段

Vxe UI vue vxe-table 中校验表格行是非常简单的&#xff0c;只需要配置好校验规则&#xff0c;然后调用 validate 方法就可以自动完成校验&#xff0c;但是由于项目淡色特殊需求&#xff0c;在某个单元格的值修改后需要对另一个列的值就行校验&#xff0c;这个时候又不需要全部…

网络基础(4)传输层

既然是传输层首先就要明确实在层状结构的哪里,除开物理层之外分成了四层协议: 到这里上层(应用层)的使用已经没有问题&#xff0c;之前使用的套接字都是在应用层的。 再说端口号 到一个主机收到一个报文的时候&#xff0c;这个报文中一定存在这个报文需要到的主机的ip号。如果…

如何利用WebSockets实现高效的实时通信应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 如何利用WebSockets实现高效的实时通信应用 如何利用WebSockets实现高效的实时通信应用 如何利用WebSockets实现高效的实时通信应…

stm32——通用定时器时钟知识点

&#xff08;该图来自小破站 铁头山羊老师的stm32标准库教学&#xff09;

Excel使用-弹窗“此工作簿包含到一个或多个可能不安全的外部源的链接”的发生与处理

文章目录 前言一、探讨问题发生原因1.引入外部公式2.引入外部数据验证二、问题现象排查及解决1.排查公式2.排查数据验证3.特殊处理方式总结前言 作为一种常用的办公软件,Excel被大家所熟知。尽管使用了多年,有时候在使用Excel时候也会发生一些不太常见的现象,需要用心核查下…

Spring中的Bean

Spring中的Bean 目录&#xff1a; 一、Bean的配置 二、Bean的实例化 三、Bean的作用域 四、Bean的装配方式 一、Bean的配置 1.IoC 容器 ​ Spring容器会负责控制程序之间的关系&#xff0c;而不是由程序代码直接控制&#xff0c;这样控制权由应用代码转移到了外部容器&…

无效的目标发行版17和无法连接Maven进程问题

起因&#xff1a;我clean了一个模块的Maven想要重新下&#xff0c;他就开始报错。两次了都是这样。如果和我一样一开始都是好好的&#xff0c;直接找Maven的设置&#xff0c;在运行程序改&#xff0c;jre变成了11.它自己变成了我其他的jdk

猎板PCB罗杰斯板材的应用案例

以下是几个猎板 PCB 与罗杰斯板材结合的具体案例&#xff1a; 案例一&#xff1a;5G 通信基站天线 PCB 在 5G 通信基站的天线系统中&#xff0c;对高频信号的传输和处理要求极高。猎板 PCB 采用罗杰斯板材&#xff0c;凭借其稳定的低介电常数&#xff08;如 RO4003C 板材&…

ollama+springboot ai+vue+elementUI整合

1. 下载安装ollama (1) 官网下载地址&#xff1a;https://github.com/ollama/ollama 这里以window版本为主&#xff0c;下载链接为&#xff1a;https://ollama.com/download/OllamaSetup.exe。 安装完毕后&#xff0c;桌面小图标有一个小图标&#xff0c;表示已安装成功&…

零基础利用实战项目学会Pytorch

目录 pytorch简介 1.线性回归 2.数据类型 2.1数据类型检验 2.2Dimension0/Rank0 2.3 Dim1/Rank1 2.4 Dim2/Rank2 3.一些方法 4.Pytorch完成分类任务 4.1模型参数 4.2 前向传播 4.3训练以及验证 4.4 三行搞定&#xff01; 4.5 准确率 5、Pytorch完成回归任务 5.…

大数据实验9:Spark安装和编程实践

实验九&#xff1a;Spark基础编程1 一、实验目的 通过实验掌握基本的Spark编程方法&#xff1b;掌握用Spark解决一些基本的数据处理和统计分析&#xff0c;去重、排序等&#xff1b; 二、实验要求 掌握Spark相关shell命令的使用&#xff1b;完成下面的实验内容&#xff0c;…

vue3 element el-table实现表格动态增加/删除/编辑表格行,带有校验规则

需求描述 在项目中遇到需要实现表格动态的新增、编辑、删除表格行的需求&#xff0c;同时带有校验规则 代码解决 点击新增的时候&#xff0c;给新增row默认属性&#xff0c;给相应的默认值&#xff0c;包括给一个isEditor: true&#xff0c;用来区分是否需要编辑。同时当有编…

Redis下载历史版本

Linux版本&#xff1a; https://download.redis.io/releases/ Windows版本&#xff1a; https://github.com/tporadowski/redis/releases Linux Redis对应gcc版本