关联容器——map

来源:互联网 发布:爱股轩软件下载 编辑:程序博客网 时间:2024/05/16 11:27

顺序容器是通过元素在容器中的位置来顺序访问的,关联容器则不同,是通过键来存储和读取元素的。常用的顺序容器有一下几种:

map元素通过键值来存取元素

set键的集合

multimap同一个键出现多次的map

multiset同一个键出现多次的set

下面只介绍map


1、map

(1) map<k, v>中的键的类型必须定义"<"操作。

(2) map定义的类型

map<k, v>::key_type键的类型,为const类型

map<k, v>::mapped_type值的类型

map<k, v>::value_typepair类型,第一个元素为const map<k, v>::key_type, 

第二个为map<k, v>::mapped_type

(3) 访问——通过下标,副作用

map<string, int> word_count;word_count["andy_jiang"];
这种方式会有副作用。当要访问的元素不存在时,将在map中会添加一个新的元素。

(4) 添加元素——下标,insert
使用下标的副作用,可以为容器添加元素。也可以直接使用insert插入元素。

word_count.insert("andy lau");
注意:insert()有三版本,需要注意insert接受单个值的返回类型。insert(e),其中,e为value_type类型,包含一个指向e.first元素的map迭代器,以及一个bool类型值,表明是否插入成功。
例子——单词统计程序

map<string, int> word_count;string word;while(cin >> word){pair<map<string, int>::iterator, bool> ret = word_count.insert(make_pair(word, 1));if(!ret.second){++ret.first->second;}}

上面的例子中,ret.second为bool类型。如果pair对插入成功,则word初始化为1。已存在map容器中,则插入失败,但是要对单词出现次数增1。

(5)删除元素——erase
m.erase(k),带有一个键参数的此版本,将返回删除的元素的个数,其他版本则返回void。在map容易中,返回值只能为1或者0。


2、map的上述几点是比较容易出错和混淆的。set、multimap、multiset的操作与map大致相同。