1,关联容器综述
关联容器和顺序容器的本质区别在于:
关联容器通过键(key)来存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
可能正是因为其不是通过位置来存储的,所以关联容器不提供front、push_front 、pop_front 、back、 push_back、 pop_back等操作。
关联容器的key值不可修改。
关联容器不能通过容器大小来定义,因为系统无法给出默认的key值。
关联容器里的元素按照key值升序排列,而与插入元素的先后顺序无(同一键值的不同元素可能与插入的先后顺序有关)。
2,map综述
map类型的元素以建-值对的形似组织,通常理解为关联数组——由键而不是位置来索引元素的数组。
键必须唯一。
头文件:
#include <map>
using std::map;
使用红黑树实现。
3,map对象的定义
map<k, v> m; //空对象
map<k, v> m(m2); //m2的副本
map<k, v> m(b, e); //迭代器b、e之间元素的副本
对于键类型,唯一的约束就是必须支持“<”操作,而且是严格弱排序的,即与自身比较时肯定能得出false的结果
所以list的迭代器就不能用作键,因为其不支持 < 操作。(list迭代器只支持自增、自减和不等于操作,不支持关系运算操作。)
4,相关类型
map<k, v>::key_type //键的类型
map<k, v>::mapped_type //值的类型
map<k, v>::value_type //pair类型 pair<const k, v>
5,添加元素
一个给定的键只能对应一个元素
(1)下标操作添加元素
下标里放的不再是位置而是键,当该键不存在时,向map中添加该键,对应的值使用值初始化。
注意:下标操作返回的是值类型,而map迭代器返回的是pair类型
(2)insert
m.insert(e) //e为value_type,即pair类型,返回一个迭代器和一个bool值的pair对象
m.insert(beg,end)//beg,end为指向value_type类型对象的迭代器,只有当其key值在m中不存在时才插入,返回void
m.insert(iter,e) // 同样,e.first不在m中时才插入
map<string, int> word_count;
word_count.insert(make_pair("WHY",1312));
注意make_pair的用法。
关于第一个版本的insert,当插入的键已存在时,不插入,返回的bool为假
上面的例子中,insert返回的类型为:
pair<map<string, int>::iterator, bool >
6,查找元素
只能查找键,而不能直接查找值。
(1)count
返回某个键存在的次数。
对于map而言,只能是0或者1
(2)find
返回指向查找的键的迭代器,不存在则返回end迭代器。
可以通过判断返回的迭代器是否为end来判断查找的键是否找到
7,删除元素 erase
m.erase(k) //按key删除,返回size_type表示删除的元素个数,
m.erase(p) //按迭代器删除,返回void
m.erase(b,e)//删除 b、e之间的元素,b、e相等时不删除,返回void