C++ STL标准库与泛型编程 (侯捷)(五)红黑树、Set、Map

关联式容器,查找与元素的安插效率都很高,相当于一个小型的数据库(用 key 去寻找数据)。其底层实现是基于两个重要的技术:红黑树、散列表

容器红黑树

原文:https://blog.csdn.net/SimonxxSun/article/details/85264200
key和data合成为value。图中举例时,只给定一个int,代表key和data是一致的。

标准库提供的函数identity,对()进行操作符重载,所以这个对象做出来的行为和函数一样,因此叫仿函数。(gnc独有的)

容器set,multiset

  • set/multiset以红黑树为底层结构,因此有元素自动排序特性,排序的依据是key,而set/multise元素的value和key合一
  • set/multisret提供遍历操作及iterator,按正常规则遍历,便能获得排序状态。
  • 不允许使用set/multiset的iterators改变元素值(因为key有其排列规则)。
  • et 的元素不允许重复,所以 insert() 调用 insert_unique()。multiset 的元素可以重复,所以 insert() 调用 insert_equal()。、
typedef typename rep_type::const_iterator iterator;

注意,这里set的迭代器是const,因此不允许通过它改变元素。

VC不提供identity(),容器set in VC6

会自己写一个类似identity()的类,比如struct _Kfn

C++ STL标准库与泛型编程 (侯捷)(五)红黑树、Set、Map_第1张图片

 容器map,multimap

与set/multiset不同的是,无法使用它们的iterator改变元素的key,但可以改变元素的data。

map的迭代器就是红黑树的迭代器,因此map中的value_type包装成pair,pair中的key属性给与const特性

map独有的operator[]

lower_bound返回的是不破坏排序得以安插value的第一个适当位置

C++ STL标准库与泛型编程 (侯捷)(五)红黑树、Set、Map_第2张图片

如果 key 值不存在,则生成一个带有默认 data 值的 value安插进去

存元素的时候中括号意义更直观,但显然直接调用insert更快。

multimap不能用中括号!!!

你可能感兴趣的:(C++ STL标准库与泛型编程 (侯捷)(五)红黑树、Set、Map)