【STL】STL中红黑树的应用set、multiset、map、multimap

来源:互联网 发布:文豆php培训学校 编辑:程序博客网 时间:2024/05/21 19:34

上一篇博客介绍了红黑树的实现,下面介绍红黑树的应用,在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。

阅读全文
0 0