1、Set
set 的特性是,所有元素都会根据元素的键值自动被排序。set 的元素不像 map 那样可以同时拥有实值(value)和键值(key),set 元素的键值就是实值,实值就是键值。 set 不允许两个元素有相同的键值。
因为 set 元素值就是其键值,关系到 set 元素的排列规则,如果任意改变 set 元素值,会严重破坏 set 组织。所以 set 的迭代器是 const_iterator,杜绝写入操作。
set 拥有与 list 相同的某些性质:当客户端对它进行元素新增操作或删除操作时,操作之前的所有迭代器,在操作之后都依然有效。当然,被删除的那个元素的迭代器必然是个例外。
由于 RB-tree 是一种平衡二叉搜索树,自动排序的效果很不错,所以标准 STL set 即以 RB-tree 为底层机制。又由于 set 所开放的各种操作接口, RB-tree 也都提供了,所以几乎所有的 set 操作行为,都只是转调用 RB-tree 的操作行为而已。大概的代码如下:
template<class Key, class Compare = less<Key>, class Alloc = alloc>
class set
{
public:
typedef Key key_type;
typedef Key value_type;
typedef Compare key_compare; // key 的比较函数
typedef Compare value_compare; // value 的比较函数
typedef rb_tree<......> rep_type;
typedef typename rep_type::const_pointer pointer; //一堆跟萃取有关的类型,都是 const 的
......
rep_type t; // 底层采用红黑树来表现 set
public:
set(); //一系列重载函数
i