顺序容器通过元素在容器中的位置顺序存储和访问元素,关联容器通过键(key)来存储和读取元素。二者的本质区别在于关联容器是通过键来高效查找和读取元素。
关联容器主要有四种:map,set,multimap,multiset(以键是否可以重复来加以区分)
pair
pari是关联容器中用到的重要类型。
pair<T1,T2> p1;
pair<T1,T2> p1(v1,v2);
make_pair(v1,v2) 生成新的pair对象,T1和T2类型有v1和v2自动确定。
p1<p2
p1.first<p2.first 或者 !(p2.first<p1.first)&&p1.second<p2.second
p1==p2
p1和p2的first和second分别相等。
构造函数
关联容器的构造函数与顺序容器的构造函数操作相同。
c<T> c1;
c<T> c1(c2);
c<T> c(b,e);
键类型的约束
关联容器的键不仅应该是一个类型,而且还需要有一个相关的比较函数(<)。严格弱排序
类型
key_type 键类型
map_type map容器特有的值类型
value_type
对于map容器 pair<const key_type,mapped_type>
对于set容器 key_type
map(key~value)
添加元素:
1.下标访问. 如果容器中没有该元素,则自动添加。新的键是const类型。
下标操作返回的是mapped_value
迭代器解引用返回的是pair<const key_value,mapped_value>
2.insert()函数
m.insert(e)
e是value_type,如果e.first已经在map当中,则不执行插入操作。该函数的返回类型是pair<map迭代器,bool类型(如果执行了插入操作则为true)>
eg.m.insert(map<string,int>::value_type(“Anna”,1))
m.insert(beg,end)
删除元素:
erase(k) k是key_value,返回size_type,删除的数量
erase(p) p是迭代器,void
erase(b,e) 一对迭代器表示删除范围
查找元素:
find(k) 返回查找到的元素的迭代器,如果没有找到元素,返回最后一个元素后面一位
count(k) 返回查找的元素的数目,在map中只有0和1两种结果
这里不能用下标操作来查找元素,因为下标操作会自动添加元素。因此在这里使用下标操作时非常危险的。
set(key)
添加元素:
insert(e); e是key_value 返回pair类型,同上
insert(b,e);一对迭代器的元素
set不支持下标操作。
查找元素:
find();
count();
set中key是const类型,iterator set_it = s.find(k); *set_it是const类型
multimap & multiset
multimap不支持下标操作,因为存在一个键对应多个实例。
添加:每一个Insert都会进行插入操作
删除:erase()同上
查找:返回第一个拥有该键的实例。
lower_bound(k):返回第一个不小于k键的元素的迭代器
upper_bound(k):返回第一个大于k键的元素的迭代器
如果不存在k键,则两个函数都指向最后元素的最后一位。
equal_range(k):返回pair<lower_bound(k),upper_bound(k)>