1 关联容器
关联容器(associative container)是对容器概念的另外一个改进。关联容器将 值 与 键 关联在一起,并使用键来查找值。
- 对于容器X,表达式X::value_type 通常指出了存储在容器中的值类型。
- 对于关联容器来说,表达式X::key_type 指出了键的类型。
优点——它提供了对元素的快速访问。与序列相似,关联容器也允许插入新元素,但不能指定元素的插入位置。原因是关联容器通常有用于确定数据放置位置的算法,以便能够快速检索信息。
原理——关联容器通常是使用某种树实现的。树是一种 数据结构,其根节点链接到一个或者两个节点,这些节点又链接到一个或两个节点,从而形成分支结构。就像链表一样,节点使得添加或者删除数据项比较简单,但是相对于链表,树的查找速度更快。
分类——STL中 提供了4种关联容器:set、multiset、map和multimap。前两种是在头文件set(以前分别为set.h和multiset.h)中定义的,后两种是在头文件map(以前分别为map.h和multimap.h)中定义的。
最简单的关联容器就是set,其值类型与键相同,键是唯一的,这意味着集合中不会有多个相同的键。
- 确实对于set来说 ,值就是键。按关键字有序保存元素:set(关键字即值,即只保存关键字的容器);multiset(关键字可重复出现的set);
- multiset 类似于set,只是可能有多个值的键相同。例如,如果键和值的类型为Int,则multiset的对象包含的内容可以是1、2、2、2、3、5、7、7。
- 在map中,值与键的类型不同。键是唯一的,每个键只对应一个值。multimap与map相似,只是一个键可以和多个值相关联。
2 set基本介绍
set就是关键字的简单集合。当只是想知道一个值是否存在时,set是最有用的。
在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。set中元素的值不能直接被改变。set内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树。
set具备的两个特点:
- set中的元素都是排序好的
- set中的元素都是唯一的,没有重复的
3 set中常用的方法
begin() 返回set容器的第一个元素
end() 返回set容器的最后一个元素
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空,如果集合为空,返回true
size() 返回当前set容器中的元素个数
max_size() 返回set容器可能包含的元素最大个数
count() 返回某个值元素的个数 (在set中不是0就是1)
insert() 在集合中插入元素
- insert(a)
- insert(begin,end) 将begin到end之间的元素插入set中
erase() 删除集合中的元素
- erase(a) 删除键为a的元素
- erase(begin,end) 删除begin到end之间的元素
- erase(iterator) 删除迭代器所指向的元素
find() 返回一个指向被查找到元素的迭代器
lower_bound(x) 返回指向大于(或等于)x中最小的一个,并返回指向该元素的迭代器
upper_bound(x) 返回大于元素x中最小的一个,并返回指向该元素的迭代器
例如:
在set{3,5,7,8,13,16}中,
对于在set中存在的元素,比如8,
s.lower_bound(8)返回8所在位置的迭代器。
s.upper_bound(8)返回13所在位置的迭代器。
对于在set中不存在的元素,比如12,
两个函数返回的则都是13所在位置的迭代器。
特殊地,
对于比set中最大的元素大的元素,比如20,
两个函数返回的都是s.end()。
swap() 交换两个集合变量