11、多重映射multimap和多重集合multiset
由于multimap/multiset与map/set有太多的相似之处,故在这里我们一起进行介绍。首先需要指出的是,multimap的特性以及用法与map完全相同,唯一的差别在于它允许键值重复。同样,multiset的特性以及用法与set完全相同,唯一的差别在于它也允许键值重复。
Map和set容器中,一个键只能对应一个实例,而multimap和multiset类型则允许一个键对应多个实例。multimap支持的头文件:#include
1、multimap和multiset中元素的添加和删除
Map和set容器的insert()和erase()操作同样适合与multimap和multiset容器,用以实现元素的添加和删除。
由于键不是要求唯一的,因此每次调用insert()总会插入一个元素。
调用带有一个参数的erase(),将会删除拥有该键的所有元素,并返回删除元素的个数。而调用带有一个或一对迭代器参数的erase()将只删除指定的元素,并返回void类型。
2、multimap和multiset中元素的查找
由于关联容器map和set都是有序的,同时又是按顺序存储的,同样在multimap和multiset容器中,如果某个键对应多个实例,则这些实例在容器中将相邻存放。
进行multimap和multiset元素查找,同样可以使用count()和find()函数,但由于multimap和multiset中可能存在重复的元素,所以要编写比较多的代码。使用count()函数求出某键的出现次数,使用find()函数返回一个迭代器,指向第一个拥有正在查找的键的实例。
一个更简洁的查找方法是使用lower_bound()和upper_bound(),这两个函数适用于所有关联容器,也可用于普通的map和set容器,但更常用于multimap和multiset,这两个函数需要传递一个键并返回一个迭代器。
m.lower_bound(key); // 返回一个迭代器,指向键不小于k的第一个元素。
m.upper_bound(key); // 返回一个迭代器,指向键大于k的第一个元素。
m.equal_range(key); // 返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k),而second成员等价于m.upper_bound(k)。
在同一个键上调用lower_bound()和upper_bound(),将产生一个迭代器范围,指示出该键所关联的所有元素。如果该键在容器中存在,lower_bound()返回指向该键所关联的第一个实例的迭代器,而upper_bound()返回指向该键所关联的最后一个实例的下一个位置。如果该键不存在,则两个操作返回同一个迭代器,指向该键在排序规则下应该插入的位置。事实上,我们也可以调用equal_bound()函数来取代lower_bound()函数和upper_bound()函数,完成相应的功能。