关联容器
关联容器支持通过键(key)来高效地查找和读取元素。两个基本的关联容器是map和set,map的元素以键-值对形式组织,键用做索引,值表示存储和读取的数据,set包含一个键,并有效地支持关于某个键是否存在的查询。
引言:pair类型
#include<utility>
pair<int,int>p; p.first=5; p.second=6; pair<int,int>p2; p2=make_pair(5,7); pair<int,int>p3(9,10);
map
map是键值对的集合,可使用键作为下标来获取一个值。键类型必须支持<操作符,而且能正确的工作。
map对象的定义
map定义的类型
对map迭代器进行解引用将产生pair类型对象,它的first成员存放键为const,second成员存放值。
map添加成员
使用下标访问map对象
使用下标(键)访问时,如果下标存在,则返回下标所关联的值,如果下标不存在,则map容器为该键创建一个新元素,并将它插入到map对象中。
//统计输入的每个单词出现的次数 map<string,int>word_count; string word; while(cin>>word) ++word_count[word];
insert使用
m.insert(e)
e为一个m上的value_type类型,如果键不存在,则插入值到map中,如果键存在(map中一个给定的键只对应一个元素),则不做任何操作。函数返回一个pair对象,指向键为e.first(即插入元素)的元素的map迭代器,以及一个bool类型对象,表示是否插入了该元素。
word_count.insert(map<string,int>::value_type("Anna",50)); word_count.insert(make_pair("Lily",100));//可以用make_pair简化 typedef map<string,int>::value_type valtype;//用typedef简化 word_count.insert(valtype("Anna",50));
m.insert(beg,end)
beg和end是标记元素范围的迭代器,其中的元素必须为m.value_type类型,对于该范围的所有元素,如果他的键不在m中,则将该键及其关联的值插入到m中,返回void类型。
m.insert(iter,e)
e是一个用在m上的value_type类型的值,如果键不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置,返回一个迭代器,指向m中具有给定键的元素。
查找并读取map中元素
map中删除对象
map对象的遍历
map也提供begin和end运算以生成用于遍历整个容器的迭代器。
set
set只是单纯的键的集合,除了不支持下标操作符,以及没有定义mapped_type类型外,可支持map定义的大部分操作,包括map的构造函数,insert操作,count和find,erase操作。和map一样,set容器存储的键也必须是唯一的,而且不能修改。
multimap和mutiset
multimap和mutiset允许一个键对应多个实例,并且与set和map包含在相同的头文件中。
带有一个键参数的erase版本将删除拥有该键的所有元素,并返回删除的个数,而带有一个或一对迭代器参数的版本只删除指定的元素,并返回void。
因为键值相同的值存储在相邻的位置,所以可以有以下方法遍历:
1.用count求出某键出现的次数,然后用find操作返回一个迭代器,依次查找;
2.可以使用返回迭代器的关联容器操作
在同一个键上调用头两个函数将产生一个迭代器范围,指示出该键所关联的所有元素。lower_bound返回的迭代器指向该键关联的第一个实例,upper_bound返回的迭代器则指向最后一个实例的下一个位置。如果该键不在容器中,这两个操作返回同一个迭代器,指向依据元素的排列顺序该键应该插入的位置或者指向容器超出末端的位置。
版权声明:本文为博主原创文章,未经博主允许不得转载。