STL之map篇

6 篇文章 0 订阅
2 篇文章 0 订阅
map/multimap
特性:
  • 具有键值和实值,根据键值自动排序
  • pair的第一个元素为键值,第二个元素为实值
  • 以红黑树为底层机制
  • map键值不可以重复,multimap键值可以重复
  • map的迭代器不可以修改键值(破坏规则),但是可以修改实值

在这里插入图片描述

map常用API
对组
  • 对组将两个值合并为一个值,两个值可以有不同的数据类型,两个值可以分别用pair的两个公有成员函数first和second访问
//创建对组的第一种方法
pair<string, int> pair1(string("name"), 20);
cout << pair1.first << endl;	//访问pair第一个值
cout << pair1.second << endl;	//访问pair第二个值

//创建对组的第二种方法
pair<string, int> pair2 = make_pair("name", 30);
cout << pair2.first <<endl;
cout << pair2,second <<endl;

//pair=赋值
pair<string, int> pair3 = pair2;
cout << pair3.first <<endl;
cout << pair3.second <<endl;

构造函数
map<T1, T2> mapTT;		//map默认构造函数
map(const map &map);	//拷贝构造函数

赋值操作
map& operator=(const map &map);	//重载等号操作符
swap(mp);	//交换两个集合容器

大小操作
size();		//返回容器中元素的数目
empty();	//判断容器是否为空

插入操作
insert(...);	//往容器中插入元素,返回pair<iterator, bool>
map<int, string> mapStu
//第一种,通过pair的方式插入对象
mapStu.insert(pair<int, string>(3, "小张"));
//第二种,通过pair的方式插入对象
mapStu.insert(make_pair(-1, "小张"));
//第三种,通过value_type的方式插入对象
mapStu.insert(map<int, string>::value_type(1, "小张"));
//第四种,通过数组的方式插入值
mapStu[3] = "小王";
mapStu[4] = "小李";
  • 前三种方法都是insert()方式插入,返回值都是pair<iterator, bool>

  • 第四种方法存在一个性能问题。在插入3时,首先在mapStu中查找键值为3的项,如果没有找到,那么久将一个键值为3,实值为初始化值得对组插入到mapStu中,然后再将这个对组的实值修改为"小王";如果找到了,则直接修改实值为“小王”

  • string strName = mapStu[2];	//只有当mapStu存在2这个键的时候才会是正确的取操作,否则会自动插入键值为2,实值为初始化值的对组
    

删除操作
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来说>=0
lower_bound(keyElem);	//返回第一个key<=keyElem元素的迭代器
upper_bound(keyElem);	//返回第一个key>keyElem元素的迭代器
equal_range(keyElem);	//返回第一个key=keyElem的上下限的两个迭代器

实例
/*
公司招聘5个员工,5个员工需要指派到不同的部门工作
人员信息由姓名、年龄、电话和工资组成
通过multimap对信息进行插入、保存、显示
分部门显示员工信息、显示全部员工信息
*/
#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<time.h>
#include<stdlib.h>
using namespace std;

#define SALE_DEPARTMENT 1 //销售部门
#define DEVELOP_DEPARTMENT 2	//研发部门
#define FINACIAL_DEPARTMENT 3	//财务部门

class Worker {
public:
	string m_strName;
	int m_ITele;
	int m_IAge;
	int m_ISalary;
};
//创建员工
void CreateWorker(vector<Worker>& vWorker) {
	string seedName = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	srand((unsigned)time(NULL));
	for (int i = 0; i < 26; i++) {
		Worker worker;
		worker.m_strName = "员工";
		worker.m_strName += seedName[i];
		worker.m_IAge = rand() % 5 + 20;
		worker.m_ITele = rand() % 9999999 + 1000000;
		worker.m_ISalary = rand() % 10000 + 10000;
		//保存员工信息
		vWorker.push_back(worker);		
	}
}
//员工分组
void WorkerByGroup(vector<Worker>& vWorker, 
                   multimap<int, Worker>& workerGroup) {
	//把员工随机分配到不同的部门
	vector<Worker>::iterator it = vWorker.begin();
	srand((unsigned)time(NULL));
	for (it; it != vWorker.end(); it++) {
		int departID = rand() % 3 + 1;
		switch (departID)
		{
		case SALE_DEPARTMENT:
			workerGroup.insert(make_pair(SALE_DEPARTMENT, *it));
			break;
		case DEVELOP_DEPARTMENT:
			workerGroup.insert(make_pair(DEVELOP_DEPARTMENT, *it));
			break;
		case FINACIAL_DEPARTMENT:
			workerGroup.insert(make_pair(FINACIAL_DEPARTMENT, *it));
			break;
		default:
			cout << "分配错误!" << endl;
			break;
		}
	}
}
//打印每组员工的信息
void ShowGroupWorker(multimap<int, Worker>& workerGroup, int departID) {
	multimap<int, Worker>::iterator it = workerGroup.find(departID);
	//计算当前部门总人数
	int departCount = workerGroup.count(departID);
	int num = 0;
	for (it, num; it != workerGroup.end() 
         && num < departCount; it++, num++) {
		cout << "  " << it->second.m_strName
			<< "   " << it->second.m_IAge
			<< "  " << it->second.m_ITele
			<< "  " << it->second.m_ISalary 
			<< "   " << departID <<endl;
	}
}
//打印全部员工信息
void PrintWorkerGroup(multimap<int, Worker>& workerGroup) {
	//打印销售部门员工信息
	cout << "   姓名" << "  年龄" << "   电话" << "    工资" << "  部门" << endl;
	ShowGroupWorker(workerGroup, SALE_DEPARTMENT);
	//打印开发部门员工信息
	ShowGroupWorker(workerGroup, DEVELOP_DEPARTMENT);
	//打印财务部门员工信息
	ShowGroupWorker(workerGroup, FINACIAL_DEPARTMENT);
}

int main() {
	//存放员工信息
	vector<Worker> vWorker;
	//multimap保存分组信息
	multimap<int, Worker> workerGroup;
	//创建员工
	CreateWorker(vWorker);
	//员工分组
	WorkerByGroup(vWorker, workerGroup);
	//打印全部员工信息
	PrintWorkerGroup(workerGroup);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值