关联容器:支持通过键来高效地查找和读取元素。
主要的关联容器有:set , map ,multimap, multiset
关联容器共享大部分顺序容器的操作,不提供的操作为:
front , push _front, push_back , pop_front , pop_back,assign , resize操作
共它操作也重新定义了含义和返回值,因为关联容器中使用了键。
“容器元素根据键的次序排列”,在迭代器遍历关联容器时,我们可以确保按键的顺序访问元素,而与元素在容器中的存放位置完全无关。
一.map
map可以理解为关联数组,也可以叫作映射。因为键值对一一映射的关系
map<K,V> m;在构造对象时,一定要指明键和值的类型
map提供了三种类型:
key_type: 键的类型
mapped_type: 值的类型
value_type: pair类型
1. 键类型的约束
键不但有一个类型,还有一个相关的比较函数,默认情况下,使用 <操作符来实现键的比较。
对于键类型,唯一的约束就是必须支持 <操作符。
2. map迭代器进行解引用将产生pair类型对象
pair类型:#include <utility>
对pair可以直接访问其成员,first,second;其成员是公有的。
map<K, V> m; //必须提供二个类型名
map<K , V>::iterator iter = m.begin();
iter->first存放键,为const;iter->second存放值,可以改变
3. 添加元素
insert(e) e是pair对象,如果e.first不存在相同,则添加新元素e.second,返回bool insert(beg,end) 添加beg---end范围间的不相同键的元素,返回void insert(iter ,e) 以迭代器iter为起点搜索新元素存储的位置,并返回一个迭代器,指向该元素 |
例:map<K,V> m;
1.m.insert(map<K,V>::value_type(K,V));
2.m.insert(make_pair(K,V));
3,下标: m[K] = “hello
在使用下标访问使程序可以非常简练。
4. 查找并读取map中的元
find(K) 存在K为键的元素,返回迭代器,不存在返回超出未端迭代器 count(K) 返回m中K出现在次数 |
Count可以用于检查map对象中某键是否存在。
5. 删除元素
erase(K) 删除键为K的元素,返回删除元素的个数,size_type erase(P) 删除迭代器P指向的元素,P必须是确实存在的,返回void erase(b,e) 删除范围b—e内的元素,返回void类型 |
二.set
map容器是键值对的一一映射,而set容器只是单纯的键的集合
区别:set不支持下标操作,只存储键。