1概述

map 由红黑树实现,其元素都是 “键值/实值” 所形成的一个对组(key/value pairs)。每个元素有一个键,是排序准则的基础。每一个键只能出现一次,不允许重复。map主要用于资料一对一映射的情况,map内部自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有序的。比如一个班级中,每个学生的学号跟他的姓名就存在着一对一映射的关系。

2定义及初始化

map<int, string> a; // 定义一个int类型的映射a
// map<int, string> a(10); // error,未定义这种构造函数
// map<int, string> a(10, 1); // error,未定义这种构造函数
map<int, string> b(a); // 定义并用映射a初始化映射b
// map<int, string> b(a.begin(), a.end());  // error,未定义这种构造函数

3基本操作

3.1容量函数

:容器大小:mp.size(); :容器最大容量:mp.max_size(); :容器判空:mp.empty(); :查找键 key 的元素个数:mp.count(key);

3.2添加函数

:在容器中插入元素:mp.insert(const T& x); :任意位置插入一个元素:mp.insert(iterator it, const T& x);

3.3删除函数

:删除键值为 keyValue 的元素:mp.pop_back(const T& keyValue); :删除迭代器所指的元素:mp.erase(iterator it); :删除区间[first,last]之间的所有元素:mp.erase(iterator first, iterator last); :清空所有元素:mp.clear();

3.4访问函数

:查找键 key 是否存在,若存在,返回该键的元素的迭代器;若不存在,返回 map.end(): mp.find(key);

3.5其他函数

:换两个同类型容器的元素:swap(map&, map&);或mp.swap(map&);

4迭代器

:开始迭代器指针:mp.begin(); :末尾迭代器指针:mp.end(); // 指向最后一个元素的下一个位置 :指向常量的开始迭代器指针:mp.cbegin(); // 意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他方式修改的,而且指针也是可以移动的。 :指向常量的末尾迭代器指针:mp.cend(); :反向迭代器指针,指向最后一个元素:mp.rbegin(); :反向迭代器指针,指向第一个元素的前一个元素:mp.rend(); :返回最后一个 key<=keyElem 元素的迭代器:mp.lower_bound(keyElem); :返回容器中 key 与 keyElem 相等的上下限的两个迭代器,这两个迭代器被放在对组(pair)中: mp.equal_range(keyElem);

 #include <iostream>
#include <map>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
	map<int,string> mp;
	// 在容器中插入元素
	mp[1] = "张三";
	mp[2] = "李四";
	mp[3] = "隔壁老王";

	cout << mp.begin()->first << endl; // 输出:1
	cout << (--mp.end())->first << endl; // 输出:3
	cout << mp.cbegin()->first << endl; // 输出:1
	cout << (--mp.cend())->first << endl; // 输出:3
	cout << mp.rbegin()->first << endl; // 输出:3
	cout << (--mp.rend())->first << endl; // 输出:1
	cout << mp.lower_bound(2)->first << endl; // 输出:2
	cout << mp.upper_bound(2)->first << endl; // 输出:3
	pair<map<int, string>::iterator, map<int, string>::iterator> t_pair = mp.equal_range(2);
	cout << t_pair.first->first << endl; // 输出:2
	cout << t_pair.second->first << endl; // 输出:3
	cout << endl;

	return 0;
}

5算法

:遍历元素

 map<int>::iterator it;
for (it = mp.begin(); it != mp.end(); it++)
    cout << it->second << endl;

6迭代器

可以看到,map 与set的用法基本一致,只有以下一处不同:map 可以像数组那样插入元素,而 set 不行。