一Map容器特性
Map是STL的一个关联容器,它提供一对一(key, value)的数据处理能力,
由于这个特性,在我们处理一对一数据的时候提供快速通道.
map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),
这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处;

包含头文件:
#include<map>
二.常用操作
1.初始化
四种初始化方式如下:
先声明一个map对象 :
map容器模板参数,第一个参数key的类型,第二参数value类型
map<int, int> mymap;
1)用insert函数插入pair数据
//pair.first key值 piar.second value值
mymap.insert(pair<int,int>(10,20));
2).使用make_pair
mymap.insert(make_pair(20, 20));
3).用insert函数插入value_type数据
mymap.insert(map<int, int>::value_type(30,30));
4)用数组方式插入数据,如下:
- 使用这种方式时,发现如果key不存在,会创建pair插入到map容器中
如果发现key存在,那么会修改key对应的value。 - 通过【】方式去访问map中一个不存在key,map会将这个访问的key插入到map中,并且给value一个默认值
mymap[40] = 40;
mymap[10] = 20;
注意:

程序示例:
void test01() {
//map容器模板参数,第一个参数key的类型,第二参数value类型
map<int, int> mymap;
//插入数据 pair.first key值 piar.second value值
//第一种
pair<map<int, int>::iterator, bool> ret = mymap.insert(pair<int, int>(10, 10));
if (ret.second) {
cout << "第一次插入成功!" << endl;
}
else {
cout << "插入失败!" << endl;
}
ret = mymap.insert(pair<int, int>(10, 20));
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[10] = 20;
mymap[50] = 50;
//发现如果key不存在,创建pair插入到map容器中
//如果发现key存在,那么会修改key对应的value
//打印
for (map<int, int>::iterator it = mymap.begin(); it != mymap.end(); it++) {
// *it 取出来的是一个pair
cout << "key:" << (*it).first << " value:" << it->second << endl;
}
//如果通过【】方式去访问map中一个不存在key,
//那么map会将这个访问的key插入到map中,并且给value一个默认值
cout << " mymap[60]: " << mymap[60] << endl;
//打印
for (map<int, int>::iterator it = mymap.begin(); it != mymap.end(); it++) {
// *it 取出来的是一个pair
cout << "key:" << (*it).first << " value:" << it->second << endl;
}
}
程序执行结果:

2.map插入自定义数据
如果在map中key存入的是自定义数据,如下所示的,以其默认的排序规则是不能实现的,所以就需要自定义排序方法了。
class MyKey {
public:
MyKey(int index, int id) {
this->mIndex = index;
this->mID = id;
}
public:
int mIndex;
int mID;
};
程序实现如下:排序用一个仿函数来实现
//仿函数
struct mycompare {
bool operator()(MyKey key1, MyKey key2) const {
return key1.mIndex > key2.mIndex;
}
};
void test02() {
map<MyKey, int, mycompare> mymap; //自动排序,自定数据类型,咋排?
mymap.insert(make_pair(MyKey(1, 2), 10));
mymap.insert(make_pair(MyKey(4, 5), 20));
map<MyKey, int, mycompare>::iterator it;
for (it = mymap.begin(); it != mymap.end(); it++) {
cout << it->first.mIndex << ":" << it->first.mID << " = " << it->second << endl;
}
}
程序执行结果:

3.map数据使用equal_range
equal_range返回容器中key与keyElem相等的上下限的两个迭代器
//equal_range
void test03() {
map<int, int> mymap;
mymap.insert(make_pair(1, 2));
mymap.insert(make_pair(2, 5));
mymap.insert(make_pair(3, 6));
//返回类型
pair<map<int, int>::iterator, map<int, int>::iterator> ret;
ret = mymap.equal_range(2);
if (ret.first != mymap.end()) {
cout << "找到lower_bound :" << (*(ret.first)).first << endl;
}
else {
cout << "没有找到";
}
if (ret.second != mymap.end()) {
cout << "找到upper_bound!" << (*(ret.second)).first << endl;
}
else {
cout << "没有找到";
}

4.map删除操作

5.map查找操作

三、案例测试
需求如下:
公司今天招聘了 5 个员工, 5 名员工进入公司之后,需要指派员工在那个部门工作
人员信息有: 姓名 年龄 电话 工资等组成
通过 Multimap 进行信息的插入 保存 显示
分部门显示员工信息 显示全部员工信息。
程序实现如下:
// Multimap Demo.cpp :
//multimap 案例
//公司今天招聘了 5 个员工, 5 名员工进入公司之后,需要指派员工在那个部门工作
//人员信息有: 姓名 年龄 电话 工资等组成
//通过 Multimap 进行信息的插入 保存 显示
//分部门显示员工信息 显示全部员工信息
//
#include <iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
#define SALE_DEPATMENT 1 //销售部门
#define DEVELOP_DEPATMENT 2 //研发部门
#define FINACIAL_DEPATMENT 3 //财务部门
class Worker
{
public:
Worker() { };
Worker(string name, string tele, int age, int salary)
:mName(name), mTele(tele), mAge(age), mSalary(salary) {}
public:
string mName;
string mTele;
int mAge;
int mSalary;
};
//存放新员工信息
void Create_Worker(vector<Worker>& worker) {
string sName = "ABCDE_";
for (int i = 0; i < 5; i++) {
Worker w;
w.mName = "员工";
w.mName += sName[i];
w.mAge = rand() % 10 + 20;//20-30
w.mSalary = rand() % 5000 + 10000;
w.mTele = "010-88888888";
worker.push_back(w);
}
}
///员工分组,把员工随机分配不同部门
void WorkerByGroup(vector<Worker>& worker, multimap<int, Worker>& WorkerGroup) {
for (auto it = worker.begin(); it != worker.end(); it++)
{
int department_No = rand() % 3 + 1;
switch (department_No)
{
case(SALE_DEPATMENT):
WorkerGroup.insert(make_pair(SALE_DEPATMENT, *it));
break;
case(DEVELOP_DEPATMENT):
WorkerGroup.insert(make_pair(DEVELOP_DEPATMENT, *it));
break;
case(FINACIAL_DEPATMENT):
WorkerGroup.insert(make_pair(FINACIAL_DEPATMENT, *it));
break;
default:
break;
}
}
}
void ShowWorkerGroup(multimap<int, Worker>& WorkerGroup, int department_id) {
multimap<int, Worker>::iterator pos = WorkerGroup.find(department_id);
//当前部门员工总人数
int count_num = WorkerGroup.count(department_id);
int num = 0;
for (auto it = pos; it != WorkerGroup.end() && num < count_num; it++, num++) {
cout << "id: " << it->first << " Name: " << it->second.mName
<< " Age: " << it->second.mAge << " Tele: " << it->second.mTele
<< " Salary: " << it->second.mSalary << endl;
}
}
//分部门显示
void PrintWorkerByGroup(multimap<int, Worker>& WorkerGroup) {
//1 销售部门
cout << "打印销售部门人员信息:" << endl;
ShowWorkerGroup(WorkerGroup, SALE_DEPATMENT);
//2 研发部
cout << "打印研发部人员信息:" << endl;
ShowWorkerGroup(WorkerGroup, DEVELOP_DEPATMENT);
//3 财务部
cout << "打印财务部人员信息:" << endl;
ShowWorkerGroup(WorkerGroup, FINACIAL_DEPATMENT);
}
int main()
{
vector<Worker> vWorker;
multimap<int, Worker> WorkerGroup;
//存放新员工信息
Create_Worker(vWorker);
WorkerByGroup(vWorker, WorkerGroup);
//员工分组
//打印
PrintWorkerByGroup(WorkerGroup);
}
程序执行结果:

本文深入探讨了STL中的Map容器特性,包括其基于红黑树的内部结构、数据自动排序功能,以及如何进行初始化、插入自定义数据、使用equal_range、删除和查找操作。同时,通过案例展示了Map在实际应用中的高效性和灵活性。
434

被折叠的 条评论
为什么被折叠?



