映射和多重映射(map和multimap)
map和multimap 容器类(映射和多重映射):#include<map>
平衡二叉树结构
map的元素是成对pair的(键key/值value),内部的元素依据其值自动排序。
一个键对应一个值(map)
一个键可以对应多个值(multimap)
平衡二叉树:空树或者是左右子树均为平衡二叉树,并且它们的高度差的绝对值不超过一。
映射和多重映射基于某一类型Key的键集的存在, 提供对T类型的数据进行快速和高效的检索。
对map而言,键只是指存储在容器中的某一成员。map不支持副本键,multimap支持副本键。
map和multimap对象包涵了键和各个键有关的值, 键和值的数据类型可以是不相同的,这与set不同。set中的key和value是key类型的,而map中的key和value是一个pair结构中的两个分量。
map支持下表运算符operator[],可以通过访问普通数组的方式访问map,返回对应下标的键值。在multimap中一个键可以对应多个不同的值。
map
<map> 内部实现: pair<key,value>组成的红黑树
map<Key, Data, Compare, Alloc>
insert() O(logn)
erase() O(logn)
find() O(logn) 找不到返回a.end()
[key]运算符O(logn) ***
<multimap> 允许重复元素, 没有[]运算符
map操作详解
1. 在map中插入元素
改变map中的条目非常简单,因为map类已经对[]操作符进行了重载
map<char,int>mymap;
mymap['a'] = 1;
mymap['b'] = 2;
或者
mymap.insert ( pair<char,int>('a',1) );
2. 查找并获取map中的元素
获得一个值的最简单方法
int ans = mymap[‘a’];
但是,只有当map中有这个键的实例时才会成功,否则会自动插入一个实例,值为初始化值。(如不存在,可能输出0)
因此我们可以使用find() 方法来发现一个键是否存在。传入的参数是要查找的key
if(mymap.find(‘a’)==mymap.end()){
//没找到
}else{
//找到insert
}
3. 从map中删除元素
通过key获取迭代器的值
map<char,int>::iterator it;
it=mymap.find('c');
mymap.erase (it); // 通过迭代器删除数据
移除某个map中某个条目用erase()
该成员方法的定义如下
iterator erase(iterator it); //通过一个条目对象删除
iterator erase(iterator first, iterator last); //删除一个范围
size_type erase(const Key& key); //通过关键字删除
clear()就相当于mymap.erase(mymap.begin(),mymap.end());
实例:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<char,int> mymap;
map<char,int>::iterator it;
mymap.insert ( pair<char,int>('a',1) );
mymap['b'] = 2;
mymap['c'] = 3;
mymap['d'] = 4;
mymap['e'] = 5;
// 删除mymap['c'] = 3
it=mymap.find('c'); // 通过key来获取迭代器
mymap.erase (it); // 通过迭代器来删除数据
mymap.erase('d'); // 通过key来删除数据
for ( it=mymap.begin() ; it != mymap.end(); it++ )
cout << (*it).first << " => " << (*it).second << endl;
int ad = mymap['f'];
cout<<ad;
getchar();
return 0;
}