2.9.1 引入

map相对于set区别,map具有键值和实值,所有元素根据键值自动排序。pair的第一元素被称为键值,第二元素被称为实值。map也是以红黑树为底层实现机制。


map/multimap区别:
map是根据key进行排序的所以,key是不能重复的。
multimap的key是可以重复的。

map常用API见map/multimap容器常用API

2.9.2 代码示例

map案列

text01

#include<iostream>
#include<map>
using namespace std; void text01()
{
//map容器模板参数,第一个参数key类型,第二个参数value类型
map<int, int> mymap; //插入数据 pair.first key的类型,第二个参数value类型。
//第一种
mymap.insert(pair<int, int>(10, 10));
pair < map<int, int>::iterator, bool> ret = mymap.insert(pair<int, int>(10, 100));
if (ret.second)
{
cout << "第一次插入成功" << endl;
}
else
{
cout << "插入失败!" << endl;
}
//第二种
mymap.insert(make_pair(20, 20));
//第三种
mymap.insert(map<int, int>::value_type(30, 30));
//第四种
mymap[40] = 40;
mymap[40] = 400;
//如果key不存在,创建pair插入到map容器中
//如果key存在,那么会修改key对应的value cout << mymap[60] << endl;//用[]访问map中不存在的key,会对改值默认初始化 //打印
for (map<int, int>::iterator it = mymap.begin(); it != mymap.end(); it++)
{
//*it取出来的是第一个pair
cout << "key:" << (*it).first << "value:" << it->second << endl;
}
} int main()
{
cout << endl << "text01:" << endl;
text01();
return 0;
}

text02

#include<iostream>
#include<map>
using namespace std; class MyKey
{
public:
MyKey(int index, int id)
{
this->mIndex = index;
this->mID = id;
}
public:
int mIndex;
int mID;
}; struct mycompare
{
bool operator()(const MyKey &key1,const MyKey &key2)const
{
return key1.mIndex > key2.mIndex;
}
}; void text02()
{
map<MyKey, int,mycompare> mymap;//自动排序,要告诉他怎么排序
mymap.insert(make_pair(MyKey(1, 2), 10));
mymap.insert(make_pair(MyKey(4, 5), 20)); for (auto it = mymap.begin(); it != mymap.end(); it++)
{
cout << it->first.mIndex << ":" << it->first.mID << "=" << it->second << endl;
}
} //text03这里没写
//主要是涉及lower_bound,upper_bound,equal_range. int main()
{
cout << endl << "text02:" << endl;
text02();
return 0;
}

multimap案列

multimap 案例
公司今天招聘了 5 个员工, 5 名员工进入公司之后,需要指派员工在那个部门工作
人员信息有: 姓名 年龄 电话 工资等组成
通过 Multimap 进行信息的插入 保存 显示
分部门显示员工信息 显示全部员工信息

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <time.h>
#include <stdlib.h>
using namespace std; #define SALE_DEPATMENT 1 // 销售部门
#define DEVELOP_DEPATMENT 2 // 研发部门
#define FINACIAL_DEPATMENT 3 // 财务部门 // multimap 案例
// 公司今天招聘了 5 个员工, 5 名员工进入公司之后,需要指派员工在那个部门工作
// 人员信息有: 姓名 年龄 电话 工资等组成
// 通过 Multimap 进行信息的插入 保存 显示
// 分部门显示员工信息 显示全部员工信息 class Worker
{
public:
string mName;
string mTele;
int mAge;
int mSalary;
}; // 创建员工
void Create_Worker(vector<Worker>& vWorker)
{
string seedName = "ABCDE";
for (int i = 0; i < 5; i++)
{
Worker worker;
worker.mName = "员工";
worker.mName += seedName.at(i);
worker.mAge = rand() % 10 + 20;
worker.mTele = "010-88888888";
worker.mSalary = rand() % 10000 + 10000;
// 保存员工信息
vWorker.push_back(worker);
}
} // 员工分组
void WorkerByGroup(vector<Worker>& vWorker, multimap<int, Worker>& workeGroup)
{
// 把员工随机分配到不同部门
srand(time(NULL));
for (vector<Worker>::iterator it = vWorker.begin(); it != vWorker.end(); it++)
{
int departID = rand() % 3 + 1;
switch (departID)
{
case SALE_DEPATMENT:
workeGroup.insert(make_pair(SALE_DEPATMENT, *it));
break;
case DEVELOP_DEPATMENT:
workeGroup.insert(make_pair(DEVELOP_DEPATMENT, *it));
break;
case FINACIAL_DEPATMENT:
workeGroup.insert(make_pair(FINACIAL_DEPATMENT, *it));
break;
default:
break;
}
}
} void showGroupWorkers(multimap<int, Worker>& workerGroup, int departID)
{
// find(key);//查找键 key 是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回 map.end();
multimap<int, Worker>::iterator it = workerGroup.find(departID);
// 找当前部门总人数
// count(keyElem);//返回容器中 key 为 keyElem 的对组个数。对 map 来说,要么是 0,要么是 1。对multimap 来说,值可能大于 1。
int Departcount = workerGroup.count(departID);
int num = 0;
for (multimap<int, Worker>::iterator pos = it; it != workerGroup.end() && num < Departcount; pos++, num++)
{
cout << "姓名:" << pos->second.mName << " 年龄:" << pos->second.mAge << " 电话:" << pos->second.mTele << " 工资:" << pos->second.mSalary << endl;
}
} // 打印每一部分员工信息
void PrintWorkerByGroup(multimap<int, Worker>& workerGroup)
{
// 打印销售部门员工信息
cout << "销售部门:" << endl;
showGroupWorkers(workerGroup, SALE_DEPATMENT);
// 打印研发部门员工信息
cout << "研发部门:" << endl;
showGroupWorkers(workerGroup, DEVELOP_DEPATMENT);
// 打印财务部门员工信息
cout << "财务部门:" << endl;
showGroupWorkers(workerGroup, FINACIAL_DEPATMENT);
} int main()
{
// 存放新员工信息
vector<Worker> vWorker;
// multimap保存分组信息
multimap<int, Worker> workerGroup;
// 创建员工
Create_Worker(vWorker);
// 员工分组
WorkerByGroup(vWorker, workerGroup);
// 打印员工信息
PrintWorkerByGroup(workerGroup);
getchar();
return 0;
}

2.9.3 代码运行结果

map

multimap

总结

map也是非常常用的容器。参考本专题set的讲解,注意和unordered_map的区别。


谢谢阅读(〃’ ▽ '〃)如有纰漏欢迎指出,觉得还不错就点个赞吧。

2.9 C++STL map/multimap容器详解的更多相关文章

  1. STL map 常见用法详解

    <算法笔记>学习笔记 map 常见用法详解 map翻译为映射,也是常用的STL容器 map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器) 1. map 的定义 / ...

  2. STL:map/multimap用法详解

    map/multimap 使用map/multimap之前要加入头文件#include<map>,map和multimap将key/value当作元素,进行管理.它们可根据key的排序准则 ...

  3. STL之六:map/multimap用法详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8547007 map/multimap 使用map/multimap之前要加入头文件# ...

  4. 跟我一起学STL(2)——vector容器详解

    一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...

  5. STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

  6. [转]STL之vector容器详解

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

  7. [转]STL之list容器详解

    List 容器 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入删除元素. 使用list容 ...

  8. [转]STL之deque容器详解

    Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中 ...

  9. C++标准模板库(STL)——map常见用法详解

    map的定义 map<typename1, typename2> mp; map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型 ...

随机推荐

  1. VLAN大战三层交换机 以及无敌的Hybrid

    VLAN与三层交换机 1.VLAN的概念与优势 2.VLAN的种类 3.静态VLAN的配置 4.Trunk介绍and配置 5.三层交换机原理 6.hybrid 1.当某个网络设备出现 故障后,就会不停 ...

  2. python基础语法_字符串编码

    Python常用字符编码 http://www.cnblogs.com/schut/p/8406897.html   Python常见字符编码间的转换   在字符串写入文件时,有时会因编码问题导致无法 ...

  3. 系统C盘空间严重的不足的几个清理方法

    大家在电脑使用久了以后,往往会遇到C盘空间不足的问题,这很可能进一步导致磁盘空间不足,软件无法正常运行,甚至电脑严重卡顿等问题. 下面给大家分享一些我自己在C盘空间不足过程中搜集的一些清理C盘空间的实 ...

  4. python数据分析入门笔记[1]

    1.Numpy: Numpy是python科学计算的基础包,它提供以下功能(不限于此): (1)快速高效的多维数组对象naarray (2)用于对数组执行元素级计算以及直接对数组执行数学运算的函数 ( ...

  5. CentOS7+Rsyslog+MySQL 搭建 Rsyslog 日志服务器

    文章目录 1.主机环境 2.rsyslog搭建 2.1.rsyslog-server搭建 2.2.rsyslog-client 2.2.1.测试 2.3.rsyslog日志分类 2.3.1.测试 3. ...

  6. kaptcha验证码参数设置

    Constant 描述 默认值 kaptcha.border 图片边框,合法值:yes , no yes kaptcha.border.color 边框颜色,合法值: r,g,b (and optio ...

  7. python中类的初始化案例

    1 class Chinese: 2 # 初始化方法的创建,init两边双下划线. 3 def __init__(self, hometown): 4 self.hometown = hometown ...

  8. NSSCTF-no_wakeup

    打开网页是一个派萌的表情包(原神玩家手动狗头) 按照题目的提示点击,出现题目的源码, 观察题目源码,发现就是一个简单的反序列化,这边手打一下php (自己太菜了,枯了) <?phpclass H ...

  9. 【C#基础概念】字节顺序(大端、小端)

    字节顺序,又称端序或尾序(英語:Endianness),在计算机科学领域中,指電腦記憶體中或在数字通信链路中,组成多字节的字的字节的排列顺序. 例如假设上述变量x类型为int,位于地址0x100处,它 ...

  10. 【基础知识】CPU 是如何工作的 |CPU 通过总线读取内存的工作方式

    一.简单cpu  是如何工作 方式讲解 CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列.CPU 从逻辑上可以划分成 3 个模块,分别是控制单元.运算单元和存储单元 ...