STL之map篇
map/multimap特性:具有键值和实值,根据键值自动排序pair的第一个元素为键值,第二个元素为实值以红黑树为底层机制map键值不可以重复,multimap键值可以重复map的迭代器不可以修改键值(破坏规则),但是可以修改实值map常用API对组对组将两个值合并为一个值,两个值可以有不同的数据类型,两个值可以分别用pair的两个公有成员函数first和second访...
·
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;
}
更多推荐
已为社区贡献4条内容
所有评论(0)