STL之map容器和multimap容器
时间:2019-08-22
本文章向大家介绍STL之map容器和multimap容器,主要包括STL之map容器和multimap容器使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
摘要:本文主要介绍了map容器和multimap容器的相关内容。
1、基本概念
1.1 Map的特性
所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。
1.1 map容器的键值无法修改
map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。
Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。
1.2 Multimap容器
Multimap和map的操作类似,唯一区别multimap键值可重复。
Map和multimap都是以红黑树为底层实现机制。
2、常用的API
API | 意义 | |
构造函数 |
map<T1, T2> mapTT |
map默认构造函数 |
map(const map &mp) | 拷贝构造函数 | |
赋值操作 |
map& operator=(const map &mp) |
重载等号操作符 |
swap(mp) | 交换两个集合容器 | |
大小操作 |
size() |
返回容器中元素的数目 |
empty() | 判断容器是否为空 | |
插入数据元素操作 |
map.insert(...); //往容器插入元素,返回pair<iterator,bool> map<int, string> mapStu; |
往容器插入元素,返回pair<iterator,bool> map<int, string> mapStu; |
第一种 通过pair的方式插入对象 |
mapStu.insert(pair<int, string>(3, "小张")); | |
第二种 通过pair的方式插入对象 |
mapStu.inset(make_pair(-1, "校长")) | |
第三种 通过value_type的方式插入对象 | mapStu.insert(map<int, string>::value_type(1, "小李")) | |
第四种 通过数组的方式插入值 |
mapStu[3] = "小刘";mapStu[5] = "小王"; |
|
删除操作 |
clear() |
删除所有元素 |
erase(pos) | 删除pos迭代器所指的元素,返回下一个元素的迭代器 | |
erase(beg,end) | 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器 | |
erase(keyElem) | 删除容器中key为keyElem的对组 | |
查找操作 |
find(key) |
查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end() |
count(keyElem) |
返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap 来说,值可能大于1 |
|
lower_bound(keyElem) | 返回第一个key>=keyElem元素的迭代器 | |
upper_bound(keyElem) | 返回第一个key>keyElem元素的迭代器 | |
equal_range(keyElem) | 返回容器中key与keyElem相等的上下限的两个迭代器 |
3、代码示例
1 #include <iostream> 2 #include<map> 3 #include <algorithm> 4 5 using namespace std; 6 7 void test01() { 8 map<int, int>m; //注意和其他容器相区分,一个是序号另外一个是键值 9 m.insert(pair<int,int>(1,10)); //这里运用四种方法给map容器插值 10 m.insert(make_pair(2,20)); 11 m.insert(map<int,int>::value_type(3,30)); 12 m[4] = 40; 13 14 for (map<int,int>::iterator it=m.begin();it!=m.end();it++) 15 { 16 cout << it->first << " " << (*it).second << endl; 17 } 18 19 if(m.empty()) 20 { 21 cout << "空" << endl; 22 } 23 else 24 { 25 cout << "size = " << m.size() << endl; 26 } 27 } 28 29 void test02() { 30 map<int, int> m; 31 m.insert(pair<int, int>(1, 10)); 32 m.insert(make_pair(2, 20)); 33 m.insert(map<int, int>::value_type(3, 30)); 34 m[4] = 40; 35 36 m.erase(1); //直接将第一个值删除 37 for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) 38 { 39 cout << "key = " << it->first << " value" << it->second << endl; 40 } 41 42 map<int, int>::iterator pos = m.find(2); //查找 43 if (pos != m.end()) 44 { 45 cout << "找到:key" << pos->first << " value:" << pos->second << endl; 46 } 47 else 48 { 49 cout << "未找到" << endl; 50 } 51 52 int num = m.count(3); //map的count 要么0 要么1 53 cout << "num = " << num << endl; 54 55 // lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。 56 57 map<int, int>::iterator ret = m.lower_bound(3); 58 if (ret != m.end()) 59 { 60 cout << "lower_bound 中key" << ret->first << " value: " << ret->second << endl; 61 } 62 else 63 { 64 cout << "未找到" << endl; 65 } 66 67 //upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。 68 ret = m.upper_bound(3); 69 if (ret != m.end()) 70 { 71 cout << "upper_bound 中key" << ret->first << " value: " << ret->second << endl; 72 } 73 else 74 { 75 cout << "未找到" << endl; 76 } 77 78 //equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。 79 80 pair<map<int, int>::iterator, map<int, int>::iterator> ret2 = m.equal_range(3); 81 82 if (ret2.first != m.end()) 83 { 84 cout << "找到了equal_range 中的lower_bound 的key " << ret2.first->first << " value: " << ret2.first->second << endl; 85 } 86 else 87 { 88 cout << "未找到" << endl; 89 } 90 91 if (ret2.second != m.end()) 92 { 93 cout << "找到了equal_range 中的upper_bound 的key " << ret2.second->first << " value: " << ret2.second->second << endl; 94 } 95 else 96 { 97 cout << "未找到" << endl; 98 } 99 } 100 bool myCompare(int &v1, int &v2){ 101 return v1 > v2; 102 } 103 104 int main() { 105 //test01(); 106 test02(); 107 system("pause"); 108 return 0; 109 }
原文地址:https://www.cnblogs.com/lzy820260594/p/11395449.html
- 得到一个物种所有基因的TSS(转录起始位点)区域的bed文件。
- 如何选择聚类模块数目
- 谁能告诉我,这数据测毁了么?
- 计算资源及编程-仅针对生信人员
- 从WGS测序得到的VCF文件里面提取位于外显子区域的【直播】我的基因组84
- 基因组重测序的unmapped reads assembly探究 【直播】我的基因组86
- Centos 下非 Root 安装 Microsoft R Open
- 下载TCGA所有癌症的maf文件做signature分析
- 比对NR库看看物种分布【直播】我的基因组88
- 探究某个基因的外显子覆盖度情况【直播】我的基因组87
- PHP底层的运行机制与原理
- CHROME开发者工具的小技巧
- 48条高效率的PHP优化写法
- 生信蓝领,一个不舍得分享的高通量数据分析框架
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- VUE-001-在表格单元格(el-table-column)中添加超链接访问
- 关于vue的title标签中出现的htmlWebpackPlugin.options.title
- dotnet tool 工具安装提示 Could not find a part of the path 安装失败
- dotnet core 进行 XML 序列化抛出 XmlSerializers dll 文件找不到
- C# dotnet 高性能多线程工具 ExecuteOnceAwaiter 只执行一次的任务
- 一道Postgresql递归树题
- 突击并发编程JUC系列-JDK1.8 扩展类型 LongAdder
- 利用tensorflow训练简单的生成对抗网络GAN
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.7):运算符(基本算数运算符、原码、反码、补码)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(字符编码和char型)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(整型、浮点型、布尔型)
- 多图详解Spring框架的设计理念与设计模式
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.2-3.5):标识符、关键字、注释、变量及常量
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.1):一个简单的例子
- 详解Java解析XML的四种方法