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

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值