C++提高编程---3.9 STL-常用容器-map/multimap 容器【P231~P235】
-
- [3.9 map/multimap 容器](#3.9 map/multimap 容器)
-
- [3.9.1 map 容器基本概念](#3.9.1 map 容器基本概念)
- [3.9.2 map 构造和赋值](#3.9.2 map 构造和赋值)
- [3.9.3 map 大小和交换](#3.9.3 map 大小和交换)
- [3.9.4 map 插入和删除](#3.9.4 map 插入和删除)
- [3.9.5 map 查找和统计](#3.9.5 map 查找和统计)
- [3.9.6 map 容器排序](#3.9.6 map 容器排序)
3.9 map/multimap 容器
3.9.1 map 容器基本概念
简介:
- map中所有元素都是pair
- pair中第一个元素为
key(键值),起到索引作用,第二个元素为value(实值) - 所有元素都会
根据元素的键值自动排序
本质:
- map/multimap属于关联式容器,底层结构是用
二叉树实现。
优点:
- 可以
根据key值快速找到value值
map和multimap区别:
- map
不允许容器中有重复key值元素 - multimap
允许容器中有重复key值元素
3.9.2 map 构造和赋值

cpp
#include<iostream>
#include<map>
using namespace std;
void printMap(const map<int, int>&m)
{
for (map<int, int>::const_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));
m.insert(pair<int, int>(4, 40));
m.insert(pair<int, int>(5, 50));
printMap(m);
// 拷贝构造
map<int, int>m2(m);
printMap(m2);
// 赋值
map<int, int>m3;
m3 = m;
printMap(m3);
}
int main() {
test01();
system("pause");
return 0;
}

总结:map中所有元素都是成对出现,插入数据时候要使用对组
3.9.3 map 大小和交换

基本和 set 容器一样
cpp
#include<iostream>
#include<map>
using namespace std;
void printMap(const map<int, int>&m)
{
for (map<int, int>::const_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));
m.insert(pair<int, int>(4, 40));
m.insert(pair<int, int>(5, 50));
cout << "交换前" << endl;
printMap(m);
if (m.empty())
cout << "m 为空" << endl;
else {
cout << "m 不为空" << endl;
cout << "m 的大小为:" << m.size() << endl;
}
map<int, int>m2;
// 默认构造
m2.insert(pair<int, int>(100, 10));
m2.insert(pair<int, int>(200, 20));
m2.insert(pair<int, int>(300, 30));
m2.insert(pair<int, int>(400, 40));
m2.insert(pair<int, int>(500, 50));
printMap(m2);
m.swap(m2);
cout << endl << "交换后" << endl;
printMap(m);
printMap(m2);
}
int main() {
test01();
system("pause");
return 0;
}

3.9.4 map 插入和删除

cpp
#include<iostream>
#include<map>
using namespace std;
void printMap(const map<int, int>&m)
{
for (map<int, int>::const_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(make_pair(3, 30)); // make_pair 不用写模板参数
// 第三种
m.insert(map<int, int>::value_type(3, 30));
// 第四种,不建议插入,但是可以用来访问
m[4] = 40;
printMap(m);
cout << m[5] << endl; // m[5] 不存在,会创建一个 value = 0 的数出来
printMap(m);
//// 删除
m.erase(m.begin());
printMap(m);
m.erase(5); // 按照 key 值删除
printMap(m);
//m.erase(m.begin(), m.end());
m.clear();
printMap(m);
}
int main() {
test01();
system("pause");
return 0;
}

3.9.5 map 查找和统计

cpp
#include<iostream>
#include<map>
using namespace std;
void printMap(const map<int, int>&m)
{
for (map<int, int>::const_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));
map<int, int>::iterator pos = m.find(3);
if (pos != m.end())
{
cout << "查到了元素 key = " << pos->first << " value 值为:" << pos->second << endl;
}
else {
cout << "未找到元素" << endl;
}
int count = m.count(3);
cout << "key 为 3 的元素有" << count << "个" << endl;
}
int main() {
test01();
system("pause");
return 0;
}

3.9.6 map 容器排序

用仿函数修改排序规则,默认按照 key 值从小到大
cpp
#include<iostream>
#include<map>
using namespace std;
// 仿函数
class MyCompare {
public:
bool operator()(int v1, int v2)
{
// 降序
return v1 > v2;
}
};
void test01() {
map<int, int, MyCompare>m;
// 第一种插入
m.insert(pair<int, int>(1, 10));
m.insert(make_pair(3, 20));
m.insert(pair<int, int>(2, 30));
for (map<int, int, MyCompare>::const_iterator it = m.begin(); it != m.end(); it++) {
cout << "key = " << (*it).first << " value = " << it->second << endl;
}
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
