我不熟悉的map
Posted love-jelly-pig
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我不熟悉的map相关的知识,希望对你有一定的参考价值。
讲map之前,其实很多都在set那篇讲过了。我不熟悉的set。
很多的API都类似,不会再累述。
map和set都是用红黑树实现的,但是set只能存单个值,它的key和value都是同一个,map不一样,它的每一个key都映射一个value.
接下来先介绍一些map自己的东西,再把和set一样的提一下。
四种插入新键值对的方式
现在我们定义一个空的map:
map<int,string> m;
下面展示四种方式。
一、pair方式
m.insert(pair<int,string>(10,"Tom"));
这是通过创建一个pair的匿名对象来保存数据。
二、make_pair
m.insert(make_pair(0,"Jerry"));
我们知道,make_pair就返回一个对组,这个对组就能直接赋值给map。
三、value_type方式
m.insert(map<int,string>::value_type(1,"Super"));
通过map内置的一个value_type来赋值。
四、直接插入
m[9] = "John";
这个方法看起来是最简单的,却暗藏杀机。当我们写以下语句:
m[100];
我们没有给它一个value,本意可能不想插入,但是一旦我们这么写,它就会给我们默认插进去,value为默认值。所以这个方法很可能使用不当。所以建议采用第二种创建方式,比较短,而且不容易出错。
如果访问key和value
map保存了两个值,提供了first和second两个函数来访问key和value,互相对应。
如下:
int main()
{
map<int, string> m;
m.insert(make_pair(0, "Jerry"));
m.insert(map<int, string>::value_type(1, "Super"));
m[9] = "John";
m[100];
for (auto mapIt = m.begin(); mapIt != m.end(); ++mapIt)
cout << "key:" << mapIt->first << " value:" << mapIt->second << endl;
return 0;
}
输出:
可以看到:
- 同样也以key排好序了。
- 且m[100]也插入了一个空。
- 我们通过迭代器调用了second和first来访问key和value。
同样的,插入也返回一个pair<iterator,bool>类型。
指定规则排序
与set无异,在创建的同时就指定排序规则。将上述代码中,声明m的语句改为:
// MyCmp是仿函数。
map<int,string,MyCmp> m;
其它操作
查找操作
与set无异。
find(key); //查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
与set无异。
删除操作
clear(); //删除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(keyElem);//删除容器中key为keyElem的对组。
与set无异。
以上是关于我不熟悉的map的主要内容,如果未能解决你的问题,请参考以下文章
RecyclerView holder中的Android Google Maps动态片段
Apache Crunch 管道如何生成 map reduce 作业?