zoukankan      html  css  js  c++  java
  • 条目二十五《熟悉非标准的散列容器》

    条目二十五《熟悉非标准的散列容器》

    STL标准不没有标准的散列容器,不过我们可以使用开源的,作为STL库中非标准存在的,即将加入标准库的hast_map,hash_set。

    它们在不同的厂商有不同的实现,比较常用的版本有:

    • 1.SGI
    • 2.Dinkumware

    二者都是基于开放式散列策略。

    前者是一个单向链表结构,只有前向迭代器。

    而后者是基于一种新的数据结构,由指向元素的双向链表的迭代器数组(本质上也是桶)组成,相邻的一对迭代器标识了每个桶中的元素的范围。(貌似内存管理的二级内存分配器也是这种结构吧)

    对于SGI需要注意的:

    SGI的散列容器通过测试两个对象是否相等,而不是是否等价来决定容器中的两个对象是否有相同的值。因为底层是数组(数组比较常见,也有链表的)嘛,数组的下标是int型。

    它的定义是下图:

    所以如果想自己控制散列容器,可以自定义一个类继承它,然后重写比较子,hash函数,分配子alloctor。

    SGI通过成员函数来实现控制hash功能,通过它们可以控制散列桶的个数,也就控制了表中元素个数与桶个数的比率。

    对于Dinkumware需要注意的:

    指定对象类型、散列函数类型、比较函数类型和分配子类型,但是它把默认的散列函数和比较函数放在一个单独的类似于traits(特性)的hash_compare类中,并把hash_compare作为容器模板的HashingInfo参数的默认实参。

    它的定义如下图:

    HashingInfo同时包含一些控制桶数目和最大rehash临界点的阈值。容器中元素个数与桶个数的最大允许比率(当超过这个比率时,散列表的桶数目将增加,表中的某些元素要被重新做散列计算)。

  • 相关阅读:
    Mybatis动态SQL
    自己动手写一个持久层框架
    最长公共子串算法(Longest Common Substring)
    【SpringCloud】08.客户端负载均衡器:Ribbon
    ESP32 (idf-esp-v4.1)重新生成nvs分区
    IDEA导入新的springboot项目出错
    springboot集成mybatis出现问题/连接数据库出错
    Java学习周记2
    2020.8.6_Java学习日记
    9.23笔试总结
  • 原文地址:https://www.cnblogs.com/liangjf/p/10276393.html
Copyright © 2011-2022 走看看