上一篇博客介绍了红黑树的实现,下面介绍红黑树的应用,在STL中容器set和map,以及multiset和multimap底层实现都是红黑树。
set
set的底层就是用红黑树实现的,set的特性,所有元素都会根据元素的键值自动地排序。set元素的键值就是实值。set不允许两个元素有相同的键值。
迭代器
1、set不能通过迭代器修改set元素值。
因为set元素值就是键值关系到set元素排序规则,迭代器底层被定义为RB-tree的const_iterator。
2、set迭代器进行插入删除操作后,迭代器仍然有效
set构造函数
(1)explicit set ( const Compare& comp = Compare(),
const Allocator& = Allocator() );
(2)template <class InputIterator>
set ( InputIterator first, InputIterator last,
const Compare& comp = Compare(), const Allocator& = Allocator() );
(3)set ( const set<Key,Compare,Allocator>& x );
(1)默认的空的构造函数,
(2)迭代器构造函数,范围[first,end)。
(3)拷贝构造函数,
熟悉的函数,就不介绍了
可以看C++文档
http://www.cplusplus.com/reference/set/set/?kw=set
find函数
set有自定义的find函数,比STL中算法提供的find函数更高效。
iterator find ( const key_type& x ) const;
查找成功的话,返回这个元素的迭代器,否则返回end。
count函数
作用:查找set中是否有这个元素
返回值:成功返回1,没有找到返回0
size_type count ( const key_type& x ) const;
lower_bound和upper_bound函数
set也有自定义的lower_bound和upper_bound函数。
iterator lower_bound ( const key_type& x ) const;
iterator upper_bound ( const key_type& x ) const;
lower_bound函数是查找不小于x的值,即第一个等于x或者第一个大于x的迭代器。
upper_bound函数是查找第一个比x大的值的迭代器。
equal_range函数
pair<iterator,iterator> equal_range ( const key_type& x ) const;
获取x元素的范围,
返回值是迭代器的键值对,其实就是lower_bound和upper_bound。
测试代码
set<int> myset;
pair<set<int>::iterator,set<int>::iterator> ret;
for (int i=1; i<=5; i++) myset.insert(i*10); // set: 10 20 30 40 50
ret = myset.equal_range(30);
cout << "lower bound points to: " << *ret.first << endl; //30
cout << "upper bound points to: " << *ret.second << endl; //40
multiset
multiset的特性以及用法与set完全相同,唯一的差别就是multiset允许键值重复,即可插入相同的元素。底层是RB-tree的insert_equal函数
map
1、map同样底层实现也是红黑树,map的特性是,所有元素都会根据元素的键值自动地排序,map所有的元素都是pari,同时拥有实值和键值,pari第一元素被视为键值,第二元素是实值
2、map不允许插入两个键值相同的元素。
3、map不允许通过迭代器修改map的元素的键值,与set同理;但是可以修改元素的实值。
4、map有与list相同的某些性质,插入和删除后,迭代器仍然有效。
map函数
map的相关函数与set类似,基本上用法都相同
http://www.cplusplus.com/reference/map/map/?kw=map
multimap
multimap的特性以及用法与map完全相同,唯一的差别就是它允许键值重复,它的底层机制是RB-tree的insert_equal。