美文网首页C++STL
《STL源码剖析》笔记:hash_table

《STL源码剖析》笔记:hash_table

作者: wayyyy | 来源:发表于2017-09-25 20:20 被阅读69次

SGI中的STL中的hash_map和hash_set底层实现是用hash_table。

  • 什么是哈希表,在另一篇文章:散列表有介绍。

hash_table

hash_table是采用开链法实现哈希表。

hash_table.jpg
template <typename Key>
class hash_table {
    ......
        typedef HashtableSetNode<Key> node;
    priavte:
        Vector<node *> buckets;
        size_type num_elements;    // 元素总个数,用于size()
    .....
}

由一个Vector保存每个list。

hash_table节点

hash_table节点.jpg
template <typename Key>
struct HashtableSetNode {
    Key key;
    HashtableSetNode* next;
};

hash_table迭代器

hash_table迭代器类型是forward_iterator,只有++,没有--后退的操作,也没有定义逆向迭代器。关于迭代器类型:《STL源码剖析》笔记:迭代器

template <typename Key>
struct HashTableSetIterator {
    ......
    typedef HashtableSetNode<Key> node;

    node* cur;                  // 迭代器目前所指向的结点
    HashTableSet<Key>* ht;      // 保持对容器的连接能力,因为需要从一个桶跳到另一个桶
}
  • 为什么需要一个记录指向的结点所在的桶ht ?
    因为在遍历时,当遍历到一个list的末尾时,我们必须要跳向下一个桶。所以需要记录指向当前节点所在的桶。
    HashTableSetIterator<Key>& HashTableSetIterator<Key>::operator++() {
        if (cur->next != nullptr)
            cur = cur->next;
        // 迭代器达到了一个list的末尾
        else {
            size_type bucket = ht->bkt_num_key(cur->key);
            /* 定位下一个非空桶或者bucket计数到末尾 */
            ++bucket;
            while(bucket < ht->bucketCount() && ht->buckets[bucket] == nullptr) 
                bucket++;            
            cur = bucket == ht->bucketCount() ? nullptr : ht->buckets[bucket];
        }
        return *this;
    }
    

相关文章

  • 《STL源码剖析》笔记:hash_table

    SGI中的STL中的hash_map和hash_set底层实现是用hash_table。 什么是哈希表,在另一篇文...

  • 《STL源码剖析》学习之traits编程

    《STL源码剖析》学习之traits编程

  • 《STL源码剖析》笔记:vector

    vector 的数据安排以及操作方式,与array常常相似,两者的唯一差别在于空间运用的灵活性:array是静态空...

  • 《STL源码剖析》笔记:list

    对于vector而言,list就要复杂得多,list 有2个特点: 相较于vector,它的好处是每次插入一个或删...

  • 《STL源码剖析》笔记:deque

    概述 vector是单向开口的连续空间,deque则是双向开口的连续空间,可以在头尾两端分别做元素的插入和删除。 ...

  • STL源码剖析

    空间配置器 分为第一级空间配置器,和第二级空间配置器 配合使用 第一级空间配置器分配大内存大于128bytes...

  • STL 源码剖析

    GitHub参考STL"源码"剖析-重点知识总结C++STL自己总结 序列式容器 所谓序列式容器,其中的元素都可序...

  • STL内存管理详细分析

    STL中内存管理非常精妙,本文以SGI STL为例,分析其内存管理的设计思路,也是对侯捷老师的《STL源码剖析》中...

  • 《STL源码剖析》读书笔记

    这两天将最后的两章给看完了,细看了其中的几个函数和类,感觉大同小异,直到怎么做的就成。记录一下书中的错漏,还有我在...

  • GeekBand-笔记-05

    总结:侯老师的这门stl课,只看视频和ppt是不太够的。应该结合侯老师的《stl源码剖析》和Nicolai M J...

网友评论

    本文标题:《STL源码剖析》笔记:hash_table

    本文链接:https://www.haomeiwen.com/subject/qogdextx.html