STL关联容器总结

一、关联式容器

STL关联容器总结

STL 关联容器分为 set(集合)和 map(映射表)两大类,及其衍生体 multiset 和 multimap。这些容器的底层机制均以 RB-tree(红黑树)实现。RB-tree 也是一个独立容器,但并不开放使用。

SGI STL 还提供一个不在标准规格的关联式容器 hash_table(散列表),以及以 hash_table 为底层机制而完成的 hash_set散列集合、hash_map散列映射表、hash_multiset散列多键集合、hash_multimap散列多键映射表。

关联容器,类似关联式数据库,每个元素都有一个键值key和一个实值value。关联式容器的内部结构是一个平衡二叉树,包括 AVL-tree、RB-tree、AA-tree,STl 中运用的是 RB-tree红黑树。

二、红黑树 RB-tree

1. 基本性质

  • RB-tree 是一个二叉搜索树。
  • 每个节点只能是红色或黑色(图中深色代表黑色,浅色代表红色)。
  • 根节点为黑色。
  • 红色节点的子节点必须为黑。
  • 任一节点至NULL(树的尾端)的任何路径,包含黑色节点数相同。

STL关联容器总结

三、set

1. 基本性质

  • set 元素的键值就是实值,实值就是键值。
  • set 不允许两个元素有相同的键值。
  • 不可以通过 set 的迭代器改变其元素值,即 set iterator 是一种 constant iterators。
  • 当对 set 进行插入删除操作后,原有的迭代器依然有效,被删除元素的迭代器除外。

2. STL 提供一组 set / multiset 相关算法,详见算法部分笔记。

四、map

1. 基本性质

  • map 的所有元素都是 pair,同时拥有实值value和键值key。pair 的第一元素为键值,第二元素为实值。
  • map 不允许两个元素拥有相同的键值。
  • 不可以通过 map 的迭代器改变其元素的键值,可以修改元素的实值。
  • 当对 map 元素进行增加或删除操作后,原有的迭代器依然有效,被删除的元素的迭代器除外。

五、multiset、multimap

multiset 和 multimap 的特性及用法与 set 和 map 完全相同,唯一差别在于允许键值重复。