基本概念
简介:
- map中所有元素都是pair
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
本质:
- map/multimap属于关联式容器,底层结构是用二叉树实现
优点:
map和multimap区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复key值元素
构造和赋值
功能描述:
函数原型:
1 2 3 4 5
| map<T1, T2>mp; map(const map &mp);
map& operator=(const map &map);
|
Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include<iostream> #include<map> using namespace std;
void printMap(map<int, int>& m) { for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) { cout << "key = " << (*it).first << " value=" << it->second << endl; } cout << endl; } void test01() { map<int, int>m; m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(3, 30)); m.insert(pair<int, int>(2, 20)); m.insert(pair<int, int>(4, 40)); printMap(m); map<int, int>m2(m); printMap(m2); map<int, int>m3; m3 = m2; printMap(m3); } int main() { test01(); system("pause"); return 0; }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| key = 1 value=10 key = 2 value=20 key = 3 value=30 key = 4 value=40
key = 1 value=10 key = 2 value=20 key = 3 value=30 key = 4 value=40
key = 1 value=10 key = 2 value=20 key = 3 value=30 key = 4 value=40
|
总结:map中所有元素都是成对出现,插入数据时候要使用对组
大小和交换
功能描述:
函数原型:
1 2 3
| size(); empty(); swap(st);
|
Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include<iostream> #include<map> using namespace std;
void printMap(map<int, int>& m) { for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) { cout << "key = " << it->first << " value=" << it->second << endl; } cout << endl; } void test01() { map<int, int>m; m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(2, 20)); m.insert(pair<int, int>(3, 30)); if (m.empty()) { cout << "m为空" << endl; } else { cout << "m不为空" << endl; cout << "m的大小为:" << m.size() << endl; } }
void test02() { map<int, int>m; m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(2, 20)); m.insert(pair<int, int>(3, 30)); map<int, int>m2; m2.insert(pair<int, int>(4, 100)); m2.insert(pair<int, int>(5, 200)); m2.insert(pair<int, int>(6, 300)); cout << "交换前:" << endl; printMap(m); printMap(m2); m.swap(m2); cout << "交换后:" << endl; printMap(m); printMap(m2); } int main() { test01(); test02(); system("pause"); return 0; }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| m不为空 m的大小为:3 交换前: key = 1 value=10 key = 2 value=20 key = 3 value=30
key = 4 value=100 key = 5 value=200 key = 6 value=300
交换后: key = 4 value=100 key = 5 value=200 key = 6 value=300
key = 1 value=10 key = 2 value=20 key = 3 value=30
|
总结:
- 统计大小—size
- 判断是否为空—empty
- 交换容器—swap
插入和删除
功能描述:
函数原型:
1 2 3 4 5
| insert(elem); clear(); erase(pos); erase(beg, end); erase(key);
|
Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<iostream> #include<map> using namespace std;
void printMap(map<int, int>& m) { for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) { cout << "key = " << it->first << " value=" << it->second << endl; } cout << endl; } void test01() { map<int, int>m; m.insert(pair<int, int>(1, 10)); m.insert(make_pair(2, 20)); m.insert(map<int, int>::value_type(3, 30)); m[4] = 40; cout << m[4] << endl; printMap(m); m.erase(m.begin()); printMap(m); m.erase(3); printMap(m); m.clear(); printMap(m); } int main() { test01(); system("pause"); return 0; }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11 12
| 40 key = 1 value=10 key = 2 value=20 key = 3 value=30 key = 4 value=40
key = 2 value=20 key = 3 value=30 key = 4 value=40
key = 2 value=20 key = 4 value=40
|
总结:
- map插入方式很多,记住其一即可
- 插入—insert
- 删除—erase
- 清空—clear
查找和统计
功能描述:
函数原型:
Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include<iostream> #include<map> using namespace std;
void test01() { map<int, int>m; m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(2, 20)); m.insert(pair<int, int>(3, 30)); map<int, 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; }
|
运行结果
1 2
| 查到了元素key = 3 value = 30 num = 1
|
总结:
- 查找—find(返回的是迭代器)
- 统计—count(对于map,结果为0或者1)
排序
学习目标:
- map容器默认排序规则为 按照key值进行 从小到大排序,掌握如何改变排序规则
主要技术点:
Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include<iostream> #include<map> using namespace std; class MyCompare { public: bool operator()(int v1, int v2)const { return v1 > v2; } };
void test01() { map<int, int, MyCompare>m; m.insert(pair<int, int>(1, 10)); m.insert(pair<int, int>(2, 20)); m.insert(pair<int, int>(5, 50)); m.insert(pair<int, int>(3, 30)); m.insert(pair<int, int>(4, 40)); for (map<int, 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; }
|
运行结果
1 2 3 4 5
| key = 5 value=50 key = 4 value=40 key = 3 value=30 key = 2 value=20 key = 1 value=10
|
总结:
- 利用仿函数可以指定map容器的排序规则
- 对于自定义数据类型,map必须要指定排序规则,同set容器
STL案例2-员工分组
案例描述
- 公司今天招聘了10个员工(ABCDEFGHIJ),10名员工进入公司之后,需要指派员工在那个部门工作
- 员工信息有:姓名 工资组成;部门分为:策划、美术、研发
- 随机给10名员工分配部门和工资
- 通过multimap进行信息的插入 key(部门编号)value(员工)
- 分部门显示员工信息
实现步骤
- 创建10名员工,放到vector中
- 遍历vector容器,取出每个员工,进行随机分组
- 分组后,将员工部门编号作为key,具体员工作为value;放入到multimap容器中
- 分部门显示员工信息
Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| #include<iostream> #include<vector> #include<map> #include<ctime> using namespace std; #define CEHUA 0 #define MEISHU 1 #define YANFA 2 class Worker { public: string m_Name; int m_Salary; }; void createWorker(vector<Worker>& v) { 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; v.push_back(worker); } }
void setGroup(vector<Worker>& v, multimap<int, Worker>& m) { for (vector<Worker>::iterator it = v.begin(); it != v.end(); it++) { int deptId = rand() % 3; m.insert(make_pair(deptId, *it)); } } void showWorkerByGroup(multimap<int, Worker>& m) { cout << "策划部门:" << endl; multimap<int, 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)); vector<Worker>vWorker; createWorker(vWorker); multimap<int, Worker>mWorker; setGroup(vWorker, mWorker); showWorkerByGroup(mWorker); system("pause"); return 0; }
|
运行结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 策划部门: 姓名:员工D 工资:13579 姓名:员工E 工资:14286 姓名:员工G 工资:11857 ----------------------- 美术部门: 姓名:员工A 工资:19486 姓名:员工B 工资:12109 姓名:员工F 工资:13109 ----------------------- 研发部门: 姓名:员工C 工资:16054 姓名:员工H 工资:12021 姓名:员工I 工资:13388 姓名:员工J 工资:17903
|