STL__set让你彻底搞清楚set的特性

set

set的特性是,所有元素都会根据元素的键值自动被排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。

我们可以通过set的迭代器改变set的元素吗?不行的,因为set元素值就是其键值,关系到set元素的排列规则。如果任意改变set元素值,会严重破坏set组织。稍后你会在set源代码之中看到的,set<T>::iterator被定义为底层RB-tree的const_iterator,杜绝写入操作。换句话说,set iterator是一种constant iterator(相对于mutable iterators)。

set拥有与list相同的某些性质:当客户端对它进行元素新增操作(insert)或删除操作(erase)时,操作之前的所有迭代器,在操作完成之后都依然有效。当然被删除的那个元素的迭代器必然是个例外。

STL 特别提供了一组 set/multiset 相关的算法,包括交集set_intersection、联集set-union、差集set_difference、对称差集set_symmetric_difference。

由于RB_tree是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STLset即以RB_tree为底层机制。又由于set所开放的各种操作接口,RB_tree也都提供了,所以几乎所有的set操作行为,都只是转调用RB_tree的操作行为而已。

下面是set的源代码摘录,其中的注释几乎说明了一切,请仔细阅读哦
STL__set让你彻底搞清楚set的特性
STL__set让你彻底搞清楚set的特性
STL__set让你彻底搞清楚set的特性
STL__set让你彻底搞清楚set的特性
STL__set让你彻底搞清楚set的特性

STL__set让你彻底搞清楚set的特性
STL__set让你彻底搞清楚set的特性