STL(六)——map、multimap
STL——map、multimap
文章目录
关联容器与map的介绍
所谓关联容器,是相对顺序容器而言,关联容器中的元素是按照关键字(KEY)l来保存和访问的(顺序容器是根据元素在容器中的位置来保存和访问的)。
关联容器中有两个最主要的类型:一个是map,另一个是set。map中的元素是键值对(key-value),其中键(key)用于索引关联的数值(value),set中只有key。
其中,在map,中键值对是以pair形式存储的,pair是标准库类型,定义在头文件utility中。pair保存两个数据成员,pair的数据是public的,两个成员分别是first和second,在map中,pair.first表示key,pair.second表示value。
⚠️map/multimap中的本身是有序的 是按key进行 升序排列的⚠️
map与set的异同
map与set的结构如图所示:
⚠️map和set的Key不可变,set的元素是const的,map中pair的第一个元素是const的。
map与multimap的异同
map 与 multimap是存储key-value(键-值 对)类型的容器。
不同之处在于:map只允许key与 value一一对应;multimap一个key可对应多个value;
⚠️上述使其不同之处,下面如果,不作特别说明,适用于map的都适用于multimap(见代码)
map类对象的构造
//map最基本的构造函数
map<string,int> mp1;
map<char,int> mp2;
map<int,char> mp3;
map<int,string> mp4;
map<double,int> mp5;
map添加元素
//map的添加元素
//第一个pair添加法
mp1.insert(pair<string,int>("aaa",100));
mp2.insert(pair<char,int>('a',100));
mp3.insert(pair<int,char>(100,'b'));
mp4.insert(pair<int,string>(100,"BBB"));
mp5.insert(pair<double,int>(0.1,200));
//第二种添加元素的方法 make_pair()
map<string,int> mp;
mp.insert(make_pair("AA",100));
map<int,double> mmp;
mmp.insert(make_pair(1,0.2));
//第三种临时map对象value_type添加元素法
mp1.insert(map<string,int>::value_type("bbb",200));
mp2.insert(map<char,int>::value_type('b',100));
mp3.insert(map<int,char>::value_type(100,'b'));
mp4.insert(map<int,string>::value_type(100,"BBB"));
mp5.insert(map<double,int>::value_type(0.2,400));
//map中最简单常用的添加元素方法(类似于数组的赋值)
//这个非常方便啊,如果 mp1对象中无"one"键值时创建one键值,若已经有 one键值,则可以对键所对应的值,!!!!进行修改、赋值!!!!!
mp1["one"] = 1;
mp2['a'] = 100;
mp3[1] = 'c';
mp4[10] = "EEE";
mp5[0.2] = 200;
map元素的遍历
//map元素的遍历
for(map<string,int>::iterator it = mp1.begin();it != mp1.end();it++)
{
cout<<it->first<<" "<<it->second<<endl;
}
map元素的查找、更改、删除
//map元素中的查找 find函数 返回一个指向键的值为key的元素的迭代器,如果没有找到返回指向超尾的迭代器
map<string,int>::iterator mit = mp1.find("aaa");
if(mit != mp1.end()) //mit 不指向超尾,成功找到
cout<<mit->second<<endl; //注意这里的 mit指针必须用“ -> ” 来访问second函数,且该函数是没有括号的
else
cout<<"Sorry\n";
map<double,int>::iterator it_5 = mp5.find(0.2);
if(it_5 != mp5.end())
cout<<it_5->first<<" "<<it_5->second<<endl;
it_5->second = 999; //可以修改键所对应的 的值
cout<<it_5->first<<" "<<it_5->second<<endl;
//it_5->first = 0.3; //但是去不可以,更改 键 值
//cout<<it_5->first<<" "<<it_5->second<<endl;
//map中元素的删除 erase(指向键值的指针) //删除该指针指向的元素
//mp5.erase(it_5);
map<double,int>::iterator it =mp5.find(0.2);
if(it == mp5.end()) // 如果it指向mp5.end()
cout<<"成功删除it_5指向的元素"<<endl;
map容器间元素的交换
//同类型map的容器内容的交换
map<string,int> m1;
map<string,int> m2;
map<string,int> m3;
map<string,int> m4;
m1.insert(pair<string,int>("A",100));
m1.insert(map<string,int>::value_type("B",200));
m1["C"] = 200;
m1["C"]++; //使 m1["C"] 的value值增加一,此时m1["A"] = 201;
m2.insert(pair<string,int>("X",777));
m2.insert(map<string,int>::value_type("Y",888));
m2["Z"] = 999;
m2["Z"]++; //使 m1["Z"] 的value值增加一,此时m2["Z"] = 1000;
m1.swap(m2); //此时 m1于m2的内容进行交换,⚠️该函数只能对两个容器的内容进行交换
for(map<string,int>::iterator it = m1.begin(); it != m1.end();it++)
cout<<it->first<<" "<<it->second<<endl;
map中常用函数
//map中常见的函数
//1. begin(), end();
//2. rbegin(), rend();
//3. clear() 清除容器中所有元素
//4. count(参数类型为:key) 返回map中的某个值的数量
cout<<endl;
cout<<"m1.count: "<<m1.count("Z")<<endl; //输出键为"Z"的值
//5. empty() 容器为空返回true
//6. equal_range() 返回特殊条目的迭代器
pair<map<string,int>::iterator,map<string,int>::iterator> pir = m1.equal_range("X");
cout<<pir.first->first<<" "<<pir.first->second;
cout<<pir.second->first<<" "<<pir.second->second;
//7. size() 返回容器元素的个数
//8. 比较两个key值的大小函数、value_comp() 比较map元素 值value 的函数
//8. lower_bound(参数:key) 返回指向 >=key 的第最后一个满足大于等于键的位置的迭代器
upper_bound(参数:key)返回指向 >key 的第一个大于key的位置的迭代器
map<string,int> mm1;
mm1["AAA"] = 1;mm1["BBB"] = 2;mm1["CCC"] = 3;
mm1["DDD"] = 4;mm1["AAA"]--;
cout<<mm1.upper_bound("CCC")->first<<" "<<mm1.upper_bound("CCC")->second<<endl;
cout<<mm1.lower_bound("CCC")->first<<" "<<mm1.lower_bound("CCC")->second<<endl;
/*输出:
DDD 4
CCC 3
*/
multimap实例应用讲解
class Person
{
public:
string name;
int age;
string tel;
int salary;
};
Person p1,p2,p3,p4,p5;
p1.name = "A";p1.age = 10;
p2.name = "B";p2.age = 11;
p3.name = "C";p3.age = 12;
p4.name = "D";p4.age = 13;
p5.name = "E";p5.age = 14;
//
multimap<string,Person> mp;
mp.insert(make_pair("Sale",p1));
mp.insert(make_pair("Sale",p2)); //⚠️这里 mp 如果不是multimap的这一条指令会插入失败(因为键值重复)
mp.insert(make_pair("Development",p3));
mp.insert(make_pair("Development",p4));//⚠️这里 mp 如果不是multimap的这一条指令会插入失败
mp.insert(make_pair("Fiancial",p5));
//遍历
for(map<string,Person>::iterator it = mp.begin(); it != mp.end() ; it++)
{
cout<<it->first<<"\t"<<it->second.name<<"\t"<<it->second.age<<endl;
}
//计算键为 Development 的元素的个数
int num = mp.count("Development");
cout<<num<<endl;
//查看、更改元素值(通过迭代器直接访问地址进行修改)
//例1:输出键为 Development 元素的值
map<string,Person>::iterator it_1 = mp.find("Development");
while(num--)
{
cout<<it_1->first<<"\t"<<it_1->second.name<<"\t"<<it_1->second.age<<endl;
it_1++;
}
//例2:更改键值为 Sale 的值的名字
for(map<string,Person>::iterator it = mp.begin(); it != mp.end() ; it++)
{
if(it->first == "Sale")
it->second.name = "Sale_" + it->second.name;
//输出修改后的结果
cout<<it->first<<"\t"<<it->second.name<<"\t"<<it->second.age<<endl;
}
特别提醒
map的sort问题,map中的元素是按键key进行升序排序的,所以不能对map用sort函数 |
map更深入探究
STL——map源码剖析(传送门)
STL(六)——map、multimap的更多相关文章
- STL:map/multimap用法详解
map/multimap 使用map/multimap之前要加入头文件#include<map>,map和multimap将key/value当作元素,进行管理.它们可根据key的排序准则 ...
- STL之map&multimap使用简介
map 1.insert 第一种:用insert函数插入pair数据 #include <map> #include <string> #include <iostrea ...
- 【STL】-Map/Multimap的用法
初始化: map<string,double> salaries; 算法: 1. 赋值.salaries[ "Pat" ] = 75000.00; 2. 无效的索引将自 ...
- 【C++ STL】Map和Multimap
1.结构 Map和multimap将key/value pair(键值/实值 队组)当作元素,进行管理.他们根据key的排序准则将元素排序.multimap允许重复元素,map不允许. 元素要求: k ...
- STL中的map/multimap小结
(1)使用map/multimap之前必须包含头文件<map>:#include<map> 并且和所有的关联式容器一样,map/multimap通常以平衡二叉树来完成 (2)n ...
- iBinary C++STL模板库关联容器之map/multimap
目录 一丶关联容器map/multimap 容器 二丶代码例子 1.map的三种插入数据的方法 3.map集合的遍历 4.验证map集合数据是否插入成功 5.map数据的查找 6.Map集合删除元素以 ...
- STL之Map和multimap容器
1.Map和multimap容器 1)map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. 2)map中key值是唯一的.集合中的元素按一 ...
- STL中 map 和 multimap
1. 所在头文件<map>. 命名空间std, 声明如下: namespace std{ template <class Key,class T, class Compare = l ...
- STL之六:map/multimap用法详解
转载于:http://blog.csdn.net/longshengguoji/article/details/8547007 map/multimap 使用map/multimap之前要加入头文件# ...
- STL——容器(Map & multimap)的删除
Map & multimap 的删除 map.clear(); //删除所有元素 map.erase(pos); //删除pos迭代器所指的元素,返回下一个元素的 ...
随机推荐
- 利用Java实现指定文件夹下的照片以自定义格式移动
前几天本猿的大学同学,一个漂亮的小姐姐工作时遇到了一个问题,她的需求是,在公司局域网的电脑上下载大量的图片重命名成指定得1.2.3.....以此类推,需要当天完成,我就临时给写了一个小demo. 我的 ...
- WEB渗透 - HTTP协议基础
年初八 星灯花 https只能提高传输层安全 每一次客户端和服务端的通信都是独立的过程 cookie包括了sessionID和其他信息 重要的header S - C Set-Cookie:服务器发给 ...
- OFD电子证照模版制作工具 --(采用wpf开发)
前言 ofd应用的范围非常广,电子证照是其中非常重要的一个应用.同一类电子证照具有相同的板式.元数据:所以电子证照非常适合用模版来制作.模版就是板式样式固定,每个具体的证照只是文字或图片内容不同.比 ...
- (转)GNU风格ARM汇编语法指南(非常详细)3
原文地址:http://zqwt.012.blog.163.com/blog/static/120446842010111482023804/ 3.GNU汇编程序中的分段 <1> . ...
- Code Index: 基于Lucene.Net的代码检索工具
目录 用途 Github地址 示例 特性 用途 维护一个拥有巨大代码量的项目, 依靠自带的代码搜索工具搜索速度缓慢, 一个快速的代码检索工具就显得极为必要, 所以自己撸了个小工具. Github地址 ...
- Lambda表达式学习笔记
Lambda基础语法 Java8中引入了一个新的操作符" -> ",该操作符被称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分成两部分: 左侧:Lamb ...
- 视觉目标跟踪算法——SRDCF算法解读
首先看下MD大神2015年ICCV论文:Martin Danelljan, Gustav Häger, Fahad Khan, Michael Felsberg. "Learning Spa ...
- ArchLinux - 脚本安装使用指南
前面不想废话,讲什么脚本说明,功能什么的!只讲使用方法,其他的可以去Gitee看,去Github看. 脚本虽然支持Boot和UEFI,但是我打算一起讲,因为它们安装时的区别,只有3处不同. 第一步 先 ...
- Spring Boot + LayUI 批量修改数据 数据包含着对象
页面展示 HTML 代码 <blockquote class="layui-elem-quote demoTable"> <div class="lay ...
- C 2015年真题【保】
1.编写一个完整的程序,使之能完成以下功能:从键盘中输入若干个整数,用链表储存这些输入的数,并要求存储的顺序与输入的顺序相反. 分析:链表建立[头插法] 代码: #include <stdio. ...