c++中的map容器
map/multimap基本概念
- Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值
- 我们可以通过map的i迭代器改变mao的键值吗?答案是不行,因为map的键值关系到map元素的排列规则,任意改变map键值会严重破坏map的组织,如果想要修改元素的实值,是可以的
- Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外
- Multimap和map的操作类似,唯一区别multimap的键值可以重复
- map和multimap都是以红黑树为底层实现机制
map 对象的拷贝构造与赋值
- map(constmap&mp); //拷贝构造函数
- map&operator=(constmap&mp); //重载等号操作符
- map.swap(mp); //交换两个集合容器
map 的大小操作
- map.size();//返回容器中元素的数目
- map.empty();//判断容器是否为空
map 的删除操作
- map.clear(); //删除所有元素 map.erase(pos);//删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
- map.erase(beg,end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
- map.erase(keyElem); //删除容器中 key 为 keyElem 的对组。
void test02(){map<int, int>m;m.insert(pair<int, int>(1, 10));m.insert(make_pair(2, 20));m.insert(map<int, int>::value_type(3, 30));m[4] = 40;m.erase(1);for (map<int, int >::iterator it = m.begin(); it != m.end(); it++){cout << "key=" << it->first << "value" << it->second << endl;}map<int,int>::iterator pos=m.find(2);if (pos != m.end()){cout << "找到,key值为:" << pos->first << "value" << pos->second << endl;}else{cout << "未找到" << endl;}int num=m.count(3);//map的count要么0要么1cout << "num=" << num << endl;//lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器map<int, int>::iterator ret = m.lower_bound(3);if (ret != m.end()){cout << "lower_bound中key" << ret->first << "value" << ret->second << endl;}else{cout << "未找到" << endl;}//upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器ret = m.upper_bound(3);if (ret != m.end()){cout << "upper_bound中key" << ret->first << "value" << ret->second << endl;}else{cout << "未找到" << endl;}pair<map<int,int>::iterator,map<int,int>::iterator>ret2= m.equal_range(3);if (ret2.first != m.end()){cout << "找到了equal_range中的lower_bound的key" << ret2.first->first << "value" << ret2.first->second << endl;}else{cout << "未找到" << endl;}if (ret2.second != m.end()){cout << "找到了equal_range中的upper_bound的key" << ret2.second->first << "value" << ret2.second->second << endl;}else{cout << "未找到" << endl;}}
map 的查找操作
- map.find(key); 查找键 key 是否存在,若存在,返回该键的元素的迭代器;若不存 在,返回 map.end();
- map.count(keyElem); //返回容器中 key 为 keyElem 的对组个数。对 map 来说,要 么是 0,要么是 1。对 multimap 来说,值可能大于 1。
map 的插入与迭代器
- map.insert(…); //往容器插入元素,返回 pair<iterator,bool>
- 在 map 中插入元素的三种方式: 假设 map<int,string>mapStu;
- 通过 pair 的方式插入对象 mapStu.insert( pair<int,string>(3,“小张”) );
- 通过 pair 的方式插入对象 mapStu.inset(make_pair(-1,“校长-1”));
- 通过 value_type 的方式插入对象 mapStu.insert( map<int,string>::value_type(1,“小李”) );
- 通过数组的方式插入值 mapStu[3]=“小刘"; mapStu[5]=“小王";
void test01(){map<int, int>m;//插入值//4种方式//第一种m.insert(pair<int, int>(1, 10));//第二种m.insert(make_pair(2, 20));//第三种m.insert(map<int, int>::value_type(3, 30));//第四种 如果保证key存在,可以通过这种方式访问m[4] = 40;for (map<int, int >::iterator it = m.begin(); it != m.end(); it++){cout << "key=" << it->first << "value" << it->second << endl;}if (m.empty()){cout << "空" << endl;}else{cout << "size=" << m.size() << endl;}}
注意
- 前三种方法,采用的是 insert()方法,该方法返回值为 pair<iterator,bool>
- 第四种方法非常直观,但存在一个性能的问题。插入 3 时,先在 mapStu 中查找主 键为 3 的项,若没发现,则将一个键为 3,值为初始化值的对组插入到 mapStu 中, 然后再将值修改成“小刘”。若发现已存在 3 这个键,则修改这个键对应的 value
- stringstrName=mapStu[2]; //取操作或插入操作
- 只有当 mapStu 存在 2 这个键时才是正确的取操作,否则会自动插入一个实例,键 为 2,值为初始化值。
//指定排序规则class myCompare{public:bool operator()(int v1, int v2){return v1 > v2;}};void test03(){//从大到小排序map<int, int,myCompare>m;m.insert(pair<int, int>(1, 10));m.insert(make_pair(2, 20));m.insert(map<int, int>::value_type(3, 30));m[4] = 40;for (map<int, int, myCompare>::iterator it = m.begin(); it != m.end(); it++){cout << "key:" << it->first << "value:" << it->second << endl;}}
c++中的map容器相关推荐
- C++STL库中的map容器
map简介 map是STL中的一个关联式的容器,可以建立key(first)和value(second)一对一的联系,由key映射到value. map内部自建了一棵红黑二叉树,可以对数据进行自动排序 ...
- C++中map容器的说明和使用技巧
C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值. 1 头文件 #include <map> 2 定义 map< ...
- leetcode(3)——697. 数组的度(C++版本注释)(map容器),448. 找到所有数组中消失的数字(取余操作,C++中的auto类型)
文章目录 前言 697 程序 思路 收获 map容器 448 程序 收获 取模操作的思考 auto 前言 大佬的程序,边刷边总结边学语言. 题目697 697 程序 class Solution {p ...
- 【小白学习C++ 教程】二十二、C++ 中的STL容器stack、queue和map
@Author:Runsen STL 中的栈容器是一种容器适配器.在栈容器中,元素在一端插入并在同一端删除. stack 为了实现堆栈容器,我们需要在我们的程序中包含头文件<stack>. ...
- map容器中删除一个元素(value)
一:问题描述 我们想要删除map容器中,一个key值对应的vlaue 二:上码 #include<iostream> #include<map> #include<vec ...
- C++ 中 map 容器的内存释放机制及内存碎片管理
C++ 中 map 容器的内存释放机制及内存碎片管理 C++ 中的容器很好用,比如 vector, map 等,可以动态扩容,自己管理内存,不用用户关心,但是在某些极端情况下,如果内存比较紧张的情况下 ...
- 聊聊 SpringCloud 中的父子容器
点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 来源公号:吉姆餐厅ak 概述 在引入 SpringCloud 的项目中会多次创建 Spring 容 ...
- STL中的map、unordered_map、hash_map
转自https://blog.csdn.net/liumou111/article/details/49252645 在之前使用STL时,经常混淆的几个数据结构,特别是做Leetcode的题目时,对于 ...
- CSU 1113 Updating a Dictionary(map容器应用)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为 ...
最新文章
- vector容器中erase(删除)的使用
- HDOJ 2012 素数判定 解题报告
- 学习笔记Hadoop(一)—— Hadoop介绍(1)——认识大数据
- SAP UI5 OData库的_getServiceSchemaVersion
- python pexpect timeout_Python 的 pexpect 模块的问题
- mapinfo图层导入奥维_(通信技能分享)怎样把谷歌地球上画的路线图导入到测试软件中!...
- 线性表——顺序表的应用
- 我的docker随笔18:阿里云docker仓库的使用
- pytorch学习笔记(五):线性回归的简洁实现
- 全国计算机vfp是什么,计算机二级VFP数据库简介
- 2021年中国鱼油发展现状及进出口状况分析:我国鱼油需求进一步扩大 [图]
- 上海车牌拍卖突破7.5万元
- 【CSDN软件工程师能力认证学习精选】Web前端经典面试试题及答案-史上最全前端面试题(含答案)
- [Python嗯~机器学习]---用python3来分析和预测加州房价
- 深入理解计算机系统(CSAPP) 实验详解:DataLab
- 测试容器网络带宽,限制容器对内存,对CPU的使用
- 使用老毛桃U盘给联想G400装系统
- java基于ssm开发的电视剧播放视频系统页面很漂亮哦
- python 匿名回调函数_Python面试题之回调函数
- DNS BIND 搭建域名智能解析DNS服务器之IP地址归类(ACL)
热门文章
- mybatis 使用merge into
- hiho1257 Snake Carpet
- (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
- echo 12345678 | base64 产生的结果跟12345678真正的base64编码不对
- java动态拼接请求_在JavaWeb项目中处理静态文件或动态链接拼接网站地址的最优处理方案...
- java thread isalive_Java线程编程中isAlive()和join()的使用详解
- oracle精确匹配时间,Oracle时间精确到时、分、秒处理方法
- 记录程序写入日志_终于有人把MySQL 三大日志讲清楚了
- android 勿扰模式代码,Android N Zen Mode (勿扰模式)设置流程
- php中mysqlstat函数,PHP函数mysql_stat介绍