购物网站开发视频教程,南里商濮阳网站建设,在线企业建站模板,龙海网站开发C提高编程
第三章 STL - 常用容器
九、map/ multimap容器
1. map基本概念
简介#xff1a;
map中所有元素都是pairpair中第一个元素为key#xff08;键值#xff09;#xff0c;起到索引作用#xff0c;第二个元素为value#xff08;实值#xff09;所有元素都会根…C提高编程
第三章 STL - 常用容器
九、map/ multimap容器
1. map基本概念
简介
map中所有元素都是pairpair中第一个元素为key键值起到索引作用第二个元素为value实值所有元素都会根据元素的键值自动排序
本质
map/multimap属于关联式容器底层结构是用二叉树实现。
优点
可以根据key值快速找到value值
map和multimap区别
map不允许容器中有重复key值元素multimap允许容器中有重复key值元素
2. map构造和赋值
功能描述
对map容器进行构造和赋值操作
函数原型
构造
mapT1, T2 mp; //map默认构造函数:map(const map mp); //拷贝构造函数
赋值
map operator(const map mp); //重载等号操作符
示例
#include mapvoid printMap(mapint,intm)
{for (mapint, int::iterator it m.begin(); it ! m.end(); it){cout key it-first value it-second endl;}cout endl;
}void test01()
{mapint,intm; //默认构造m.insert(pairint, int(1, 10));m.insert(pairint, int(2, 20));m.insert(pairint, int(3, 30));printMap(m);mapint, intm2(m); //拷贝构造printMap(m2);mapint, intm3;m3 m2; //赋值printMap(m3);
}int main() {test01();system(pause);return 0;
}/*key 1 value 10key 2 value 20key 3 value 30key 1 value 10key 2 value 20key 3 value 30key 1 value 10key 2 value 20key 3 value 30
*/总结map中所有元素都是成对出现插入数据时候要使用对组
3. map大小和交换
功能描述
统计map容器大小以及交换map容器
函数原型
size(); //返回容器中元素的数目empty(); //判断容器是否为空swap(st); //交换两个集合容器
示例
#include mapvoid printMap(mapint,intm)
{for (mapint, int::iterator it m.begin(); it ! m.end(); it){cout key it-first value it-second endl;}cout endl;
}void test01()
{mapint, intm;m.insert(pairint, int(1, 10));m.insert(pairint, int(2, 20));m.insert(pairint, int(3, 30));if (m.empty()){cout m为空 endl;}else{cout m不为空 endl;cout m的大小为 m.size() endl;}
}//交换
void test02()
{mapint, intm;m.insert(pairint, int(1, 10));m.insert(pairint, int(2, 20));m.insert(pairint, int(3, 30));mapint, intm2;m2.insert(pairint, int(4, 100));m2.insert(pairint, int(5, 200));m2.insert(pairint, int(6, 300));cout 交换前 endl;printMap(m);printMap(m2);cout 交换后 endl;m.swap(m2);printMap(m);printMap(m2);
}int main() {test01();test02();system(pause);return 0;
}/*m不为空m的大小为 3交换前key 1 value 10key 2 value 20key 3 value 30key 4 value 100key 5 value 200key 6 value 300交换后key 4 value 100key 5 value 200key 6 value 300key 1 value 10key 2 value 20key 3 value 30
*/总结
统计大小 — size判断是否为空 — empty交换容器 — swap
4. map插入和删除
功能描述
map容器进行插入数据和删除数据
函数原型
insert(elem); //在容器中插入元素。clear(); //清除所有元素erase(pos); //删除pos迭代器所指的元素返回下一个元素的迭代器。erase(beg, end); //删除区间[beg,end)的所有元素 返回下一个元素的迭代器。erase(key); //删除容器中值为key的元素。
示例
#include mapvoid printMap(mapint,intm)
{for (mapint, int::iterator it m.begin(); it ! m.end(); it){cout key it-first value it-second endl;}cout endl;
}void test01()
{//插入mapint, int m;//第一种插入方式m.insert(pairint, int(1, 10));//第二种插入方式m.insert(make_pair(2, 20));//第三种插入方式m.insert(mapint, int::value_type(3, 30));//第四种插入方式m[4] 40; printMap(m);//删除m.erase(m.begin());printMap(m);m.erase(3);printMap(m);//清空m.erase(m.begin(),m.end());m.clear();printMap(m);
}int main() {test01();system(pause);return 0;
}/*key 1 value 10key 2 value 20key 3 value 30key 4 value 40key 2 value 20key 3 value 30key 4 value 40key 2 value 20key 4 value 40*/总结
map插入方式很多记住其一即可
插入 — insert删除 — erase清空 — clear
5. map查找和统计
功能描述
对map容器进行查找数据以及统计数据
函数原型
find(key); //查找key是否存在,若存在返回该键的元素的迭代器若不存在返回set.end();count(key); //统计key的元素个数
示例
#include map//查找和统计
void test01()
{mapint, intm; m.insert(pairint, int(1, 10));m.insert(pairint, int(2, 20));m.insert(pairint, int(3, 30));//查找mapint, int::iterator pos m.find(3);if (pos ! m.end()){cout 找到了元素 key (*pos).first value (*pos).second endl;}else{cout 未找到元素 endl;}//统计int num m.count(3);cout num num endl;
}int main() {test01();system(pause);return 0;
}/*找到了元素 key 3 value 30num 1
*/总结
查找 — find 返回的是迭代器统计 — count 对于map结果为0或者1
6. map容器排序
学习目标
map容器默认排序规则为 按照key值进行 从小到大排序掌握如何改变排序规则
主要技术点:
利用仿函数可以改变排序规则
示例
#include mapclass MyCompare {
public:bool operator()(int v1, int v2) const {return v1 v2;}
};void test01()
{//默认从小到大排序//利用仿函数实现从大到小排序mapint, int, MyCompare m;m.insert(make_pair(1, 10));m.insert(make_pair(2, 20));m.insert(make_pair(3, 30));m.insert(make_pair(4, 40));m.insert(make_pair(5, 50));for (mapint, int, MyCompare::iterator it m.begin(); it ! m.end(); it) {cout key: it-first value: it-second endl;}
}
int main() {test01();system(pause);return 0;
}/*key:5 value:50key:4 value:40key:3 value:30key:2 value:20key:1 value:10
*/总结
利用仿函数可以指定map容器的排序规则对于自定义数据类型map必须要指定排序规则,同set容器
十、案例-员工分组
1. 案例描述
公司今天招聘了10个员工ABCDEFGHIJ10名员工进入公司之后需要指派员工在那个部门工作员工信息有: 姓名 工资组成部门分为策划、美术、研发随机给10名员工分配部门和工资通过multimap进行信息的插入 key(部门编号) value(员工)分部门显示员工信息
2. 实现步骤
创建10名员工放到vector中遍历vector容器取出每个员工进行随机分组分组后将员工部门编号作为key具体员工作为value放入到multimap容器中分部门显示员工信息
案例代码
#includeiostream
using namespace std;
#include vector
#include string
#include map
#include ctime/*
- 公司今天招聘了10个员工ABCDEFGHIJ10名员工进入公司之后需要指派员工在那个部门工作
- 员工信息有: 姓名 工资组成部门分为策划、美术、研发
- 随机给10名员工分配部门和工资
- 通过multimap进行信息的插入 key(部门编号) value(员工)
- 分部门显示员工信息
*/#define CEHUA 0
#define MEISHU 1
#define YANFA 2class Worker
{
public:string m_Name;int m_Salary;
};void createWorker(vectorWorkerv)
{string nameSeed ABCDEFGHIJ;for (int i 0; i 10; i){Worker worker;worker.m_Name 员工;worker.m_Name nameSeed[i];worker.m_Salary rand() % 10000 10000; // 10000 ~ 19999//将员工放入到容器中v.push_back(worker);}
}//员工分组
void setGroup(vectorWorkerv,multimapint,Workerm)
{for (vectorWorker::iterator it v.begin(); it ! v.end(); it){//产生随机部门编号int deptId rand() % 3; // 0 1 2 //将员工插入到分组中//key部门编号value具体员工m.insert(make_pair(deptId, *it));}
}void showWorkerByGourp(multimapint,Workerm)
{// 0 A B C 1 D E 2 F G ...cout 策划部门 endl;multimapint,Worker::iterator pos m.find(CEHUA);int count m.count(CEHUA); // 统计具体人数int index 0;for (; pos ! m.end() index count; pos , index){cout 姓名 pos-second.m_Name 工资 pos-second.m_Salary endl;}cout ---------------------- endl;cout 美术部门 endl;pos m.find(MEISHU);count m.count(MEISHU); // 统计具体人数index 0;for (; pos ! m.end() index count; pos, index){cout 姓名 pos-second.m_Name 工资 pos-second.m_Salary endl;}cout ---------------------- endl;cout 研发部门 endl;pos m.find(YANFA);count m.count(YANFA); // 统计具体人数index 0;for (; pos ! m.end() index count; pos, index){cout 姓名 pos-second.m_Name 工资 pos-second.m_Salary endl;}}int main() {srand((unsigned int)time(NULL));//1、创建员工vectorWorkervWorker;createWorker(vWorker);//2、员工分组multimapint, WorkermWorker;setGroup(vWorker, mWorker);//3、分组显示员工showWorkerByGourp(mWorker);测试//for (vectorWorker::iterator it vWorker.begin(); it ! vWorker.end(); it)//{// cout 姓名 it-m_Name 工资 it-m_Salary endl;//}system(pause);return 0;
}/*策划部门姓名 员工A 工资 16609姓名 员工B 工资 18235姓名 员工E 工资 13506----------------------美术部门 姓名 员工H 工资 19680姓名 员工J 工资 12307----------------------研发部门 姓名 员工C 工资 11034姓名 员工D 工资 16951姓名 员工F 工资 12186姓名 员工G 工资 12650姓名 员工I 工资 19337
*/总结
当数据以键值对形式存在可以考虑用map 或 multimap