• STL源码分析读书笔记--第5章--关联式容器


    1.关联式容器的概念

    上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引。它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是用红黑树实现,红黑树是一种基本平衡的二叉搜索树,红黑树的原理wiki上讲得很清楚,书中只是把算法实现在了底层而已,在SGI STL中RB-tree是作为底层数据结构供其他容器配接用,因此关联容器可以看做都是adaptor模式的应用。

    关联式容器的概念类似于关联式数据库,为获得良好的搜索效率,一般用平衡二叉树作为底层实现,而红黑树是一种应用广泛的平衡兴致很好的BST。元素被插入关联容器中时,根据特定规则,比如,map根据键大小,set根据元素本身大小在树中摆放(这就是关联的含义)。也正是这个原因,关联容器没有头尾之说,因此涉及头尾的操作如pop,push之类的函数都没有

    2.准备知识—RB-tree

    将RB-tree泛化实现在STL框架之中是整个关联容器涉及的重中之重。下面分析RB-tree的实现

    • RB-tree迭代器涉及
      由关联容器的概念--不支持按序索引就知道它的迭代器肯定不是Random_access_iterator,实际上,它的迭代器是双向迭代器bidirecitonal_iterator,听起来好像list的迭代器,对吧?的确,使用起来很类似。
    • RB-tree内存配置与构造函数
      使用std::alloc即可。由于是树结构,类似于链表结构,所以内存配置没有deque那么复杂。
    • RB-tree的元素操作
      第一类:插入  第二类:查找 ----以方便供配接器们使用

    3.set

    • set概述
      • 特性:所有元素会根据元素大小自动排序,所以呢,如果存入的是非对象类型,需要自己实现比较操作符,缺省是递增排序,set键值是合一的,这点与map不同,不能有相同的元素。
      • 不能随意改变set元素值,这会破坏set的树组织结构,为了防止用户在不知情的情况下误操作,set<T>::iterator被定义为底层RB-tree的const_iterator,防止写入。
    • set迭代器
      • 双向的,不存在失效问题
      • const的,不能随意写入
    • set操作,见api好了

    4.map

    • map概述
      • 特性:map的每个元素都是pair,按照键值排序,实值不参与排序
      • 可以随意改变实值,但是不能随意改变键值
    • map迭代器
      • 不存在失效问题,双向
      • 键值不可变,实值可变
    • map操作,见API文档

    5.multiset/multimap

    允许元素重复,实现的代价是底层的红黑树实现变得更复杂。

    6.hashtable

    • hash_table概述
      hash表就是散列表在STL里面的实现而已。
      hash_map和hash_set底层的实现结构,也就是说,hash_map和hash_set也是adaptor的一种用法。
      具体实现时,SGI STL用的是开链法防止冲突,底层用vector实现桶操作,因此hash_table的内存管理和构造还是比较麻烦的。
    • hash_table迭代器
      hash_table的迭代器(SGI实现)是单向的,因为没有必要双向。
      hash_table的迭代器有失效问题。
      hash_table是hash_map和hash_set的底层实现,因此它们的迭代器也会失效情形的。
    • hash_table函数
      主要是供需要配接的容器hash_map和hash_set调用。

    7.hash_map

    hash_map和普通map的区别是底层实现不同,因此区别由此而生,比如,hash_map的迭代器是单向的,普通map是双向的,hash_map搜索的复杂度是常数时间,map的复杂度是O(lgN),同样,由于底层不是红黑树,hash_map里面的元素不会自动有序。

    8.hash_set

    hash_set的接口与set接口也基本相同,但是同样的,hash_set里面的元素不会自动有序。

    总结:理解了RB-tree和hash_table,就掌握了关联容器的精髓!

  • 相关阅读:
    react实例:理解dva构建项目的原理
    Git多人协作常用命令
    justreq——反向代理与本地缓存数据
    使用ember-cli脚手架快速构建项目
    数据可视化d3.v4.js
    【Bootstrap基础学习】04 Bootstrap的HTML和CSS编码规范
    【Bootstrap基础学习】03 Bootstrap插件示例
    【Bootstrap基础学习】02 Bootstrap的布局组件应用示例
    【Bootstrap基础学习】01 Bootstrap的CSS
    【Bootstrap基础学习】00 序
  • 原文地址:https://www.cnblogs.com/obama/p/3319510.html
Copyright © 2020-2023  润新知