一、map的特性
1.map中的所有元素都是pair。
2.pair中有两个元素,第一元素为键值(key),第二元素为实值(value)。
3.map中的所有元素会根据键值自动排序。
4.map中的元素不允许拥有相同的键值。
5.不可以通过map 的迭代器来改变map 的键值。map的键值关系到map的元素的排列规则,任意改变map元素键值将严重破坏map的组织。
6.可以通过迭代器来修改元素的实值。
二、本质
1.map的底层机制是红黑树(每个节点的内容是一个pair),有着不错的自动排序效果,查找的效率 O(log2n)
2.由于map所开放的操作接口,RB-Tree也都提供了,所以几乎所有的map操作行为,都只是调用RB-Tree的操作行为而已。
图1
如图1所示,begin()是RB-Tree的最左侧节点,end()是RB-Tree的最右侧节点。
三、map的使用及操作函数示例
#include <iostream>
#include <map> //使用map所需的头文件
#include <algorithm> //算法头文件
using namespace std;
void PrintMap(pair<char,int> pr)
{
//first为键值,second为实值
cout << pr.first << " " << pr.second << endl;
}
int main()
{
map<char,int> mp; //定义一个键值为char, 实值为int的 mp 对象
//先向 map 中添加 6 个 pair 元素
mp['A'] = 10;
mp['B'] = 20;
mp['C'] = 30;
mp['D'] = 40;
mp['E'] = 50;
mp['F'] = 60;
map<char,int>::iterator ite = mp.begin(); //beigin(),返回map中首元素的迭代器
//第一种 遍历打印 map 的方式
while(ite != mp.end()) //end()返回map中尾元素的下一个元素的迭代器
{
cout << ite->first << " " << ite->second << endl;
++ite;
}
//第二种 使用 for_each 函数打印 map
::for_each(mp.begin(),mp.end(),&PrintMap);
//返回键值为 'C' 的迭代器
map<char,int>::iterator itePos = mp.find('C'); //find 返回相应的指定键值的迭代器
//删除键值为 'C' 的键值对
mp.erase(itePos); //erase 删除指定位置上的 map 元素
//插入新的键值对
pair<char,int> pr('C',70);
mp.insert(pr); //inert 向 map 中插入键值对
//count 判断该键值的 map 元素是否存在
cout << mp.count('C') << endl; //count 存在返回1,不存在返回0
//返回该键值或者大于该键值的 map 的迭代器
itePos = mp.lower_bound('A');
cout << itePos->first << " " << itePos->second << endl;
//返回大于该键值的 map 的迭代器
itePos = mp.upper_bound('A');
cout << itePos->first << " " << itePos->second << endl;
//返回 map 中的元素的个数
cout << mp.size() << endl;
//empty 判断map是否为空 为空返回true,否则返回false
cout << mp.empty() << endl;
map <char,int> mp2;
mp2['G'] = 80;
//swap 交换 两个map的所有元素
mp.swap(mp2);
//clear 清除map中的所有元素
mp.clear();
system("pause");
return 0;
}