一、map应用场景
在很多地方,我们需要用到按值存储;与之相对的概念是按照索引来存储。比如,我们需要存一个数组,表示365天中每天的收入情况,此时我们肯定会选择数组或者vector结构,这种按照索引存储的概念是最直接的。但是,有时候会存在另外一种情况,有N个人,每个人都对应有一定的收入,我们需要将这些人和他们的收入存储起来,此时如果我们直接将人和收入作为一个结构体来存储,采用数组模式,当我们在检索的时候不得不遍历整个链表来实现。通过C++ STL自带的map结构,我们可以实现按照值存储,使用key-value模式,就可以直接用key来检索对应的value了。
二、map常用操作
2.1map的定义
map<key_type, myvalue_type> mymap;
2.2map的插入
map的插入有两种模式:
方法一:mymap[key1]=value1;这种模式简单方便,但是有弊端:这个插入的过程是先寻找key1是否存在,如果不存在,插入这个对象并进行初始化,然后再将value1赋值给这个对象。
方法二:mymap.insert(map<key_type,myvalue_type>:: value_type(key1, value1))
2.3map的查找
获得一个key对应value的最简单方法是value=mymap[key1];但是此处有陷阱:如果mymap中不含有key1,那么将自动插入key1,然后返回初始化的值,这显然不是我们想要的结果。
这里,我们采用find方法:具体情况如下 :
map<key_type, myvalue_type>::iterator itp;
itp=mymap.find(key1);
if(itp!=mymap.find()){
key=itp->first;
value=itp->second;
}
2.4map的删除
iterator erase(iterator it); //通过一个条目对象删除
iterator erase(iterator first, iterator last); //删除一个范围
size_type erase(const Key& key); //通过关键字删除
2.5map的属性
map常用的两个属性方法是empty和size。
三、map的实现方式
四、使用map的注意事项
1.map是一种有序的组织结构,所以在查找的时候能够实现log(N)的复杂度,所以,对key_type的比较就显得比较重要了。所以,如果我们需要用的keytype不是内建的数据类型,那么我们需要自己来定义比较函数。例如,采用Point作为key_value的情况如下:
struct Point{
bool operator <(const Point &pt) const{
return (x<pt.x || (x==pt.x && y<pt.y));
}
int x;
int y;
}
2.map中的变量类型__pair
map中的变量是key_value模式,实际上是一个pair类型。我们再插入map元素的时候,可以这样写
mymap.insert(make_pair(mykey, myvalue));
或者mymap.insert(pair<key_type, value_type>(mykey, myvalue));
make_pair与pair的区别在于,前者会进行隐式的类型转换。
注意:map包含在头文件utility之中