关联式容器——hash_set和hash_multiset

  • hash_set

      STL set多半以RB-tree为底层实现。SGI则是在STL标准规格之外又提供了一个所谓的hash_set,以hash_table为底层实现机制。由于hash_set所提供的操作接口,hashtable都提供了,所以几乎所有hash_set操作行为,都只是调用hashtable的操作而已。但是需要注意的是红黑树有自动排序功能而哈希表没有,所反应出来的结果就是,set的元素有自动排序功能而hash_set没有。和set一样,hash_set的实值就是键值。由于hashtable有一些无法处理的类别(除非用户为那些类型写hash function),凡是hashtable无法处理的,hash_set也无法处理。

template <typename Value, typename HashFcn= hash<Value>, typename EqualKey = equal_to<Value>,typename Alloc = alloc>
//Compare缺省的情况使用递增排序
 
class hash_set{
private:
    typedef hashtable<Value, Value, HashFcn, identity<Value>, EqualKey, Alloc> ht;
    ht rep;//底层机制以hash table 完成
public:
    typedef typename ht::key_type key_type;
    typedef typename ht::value_type value_type;
    typedef typename ht::hasher hasher;
    typedef typename ht::key_equal key_equal;

    typedef typename ht::const_pointer pointer;
    typedef typename ht::const_pointer const_pointer;
    typedef typename ht::const_reference reference;
    typedef typename ht::const_reference const_reference;    
    typedef typename ht::const_iterator iterator; 
    typedef typename ht::const_iterator const_iterator;      
    typedef typename ht::size_type size_type;
    typedef typename ht::difference_type difference_type;

    hasher hash_funct() const {return rep.hash_funct();}
    key_equal key_eq() const  {return rep.key_eq();}
public:
    //下面几个是构造函数
    hash_set():rep(100, hasher(), key_equal()){}
    explicit hash_set(size_type n):rep(n, hasher(), key_equal()){}
    hash_set(size_type n, const hasher& hf):rep(n, hf, key_equal()){}
    hash_set(size_type n, const hasher& hf, const key_equal& eql):rep(n, hf,edl){}
    //以下插入操作全部使用insert_unique()
    template<typename InputIterator>
    hash_set(InputIterator f, InputIterator l):rep(100, hasher(), key_equal()){rep.insert_unique(f, l);}
    template<typename InputIterator>
    hash_set(InputIterator f, InputIterator l, size_type n):rep(n, hasher(), key_equal()){rep.insert_unique(f, l);}
    template<typename InputIterator>
    hash_set(InputIterator f, InputIterator l, size_type n, const hasher& hf):rep(n, hf, key_equal()){rep.insert_unique(f, l);}
    template<typename InputIterator>
    hash_set(InputIterator f, InputIterator l, size_type n, const hasher& hf,const key_equal& eql):rep(n, hf,edl){rep.insert_unique(f, l);}

    //下面是一些常用操作
    size_type size(){return rep.size();}
    size_type max_size(){return rep.max_size();}
    bool empty() const {return rep.empty();}
    iterator begin() const{return rep.begin();}    
    iterator end() const{return rep.end();}
    //注意返回值类型是pair
    pair<iterator, bool> insert(const value_type& obj){
        pair<typename ht::iterator, bool> p = rep.insert_unique(obj);
        return pair<iterator, bool>(p.first, p.second);
    }
    //返回值类型是void
    template<typename InputIterator>
    void insert(InputIterator f, InputIterator l){rep.insert_unique(f, l);}   
    
}

hash_set提供的常用函数介绍:

  • size_type size() 返回set中元素个数
  • iterator begin()和Iterator end()

        begin()函数返回第一个元素的迭代器(第一盛有元素的桶子的第一个元素的迭代器),end()返回最后一个元素的迭代器(最后一个盛有元素的桶子的最后一个元素的迭代器)

  • pair<iterator, bool> insert(const value_type& obj)

         注意返回值是pair,参数是插入的元素

  • void insert(InputIterator f, InputIterator l)

        返回值是void,第一参数是所盛放插入元素容器的第一个元素的迭代器,第二个参数是所盛放插入元素容器的最后一个元素的迭代器(也可以指定把容器中那一段元素插入)

  • iterator find(const key_type& key)返回键值为key的元素的迭代器
  • size_type count(const key_type& key) const 返回set中拥有多少键值为key的元素
  • size_type erase(const key_type& key) 返回删除的键值为key的元素个数
  • void erase(iterator it)删除it位置的元素
  • void erase(iterator first, iterator last)删除first和last之间的元素
  • void resize(size_type hint)如果hint(元素个数)大于当前的桶子个数,重新分配,否则不重新分配。
  • size_type bucket_count() 返回当前hash_set的桶子个数
  • size_type elems_in_bucket(size_type n)返回第n个桶子中所拥有的元素的个数
  • hash_multiset

       hash_multiset的特性与multiset完全相同,唯一的差别在于它的底层机制是hashtable。也因此hash_multiset的元素并不会被自动排序。hash_multiset和hash_set实现上的唯一差别在于,前者的元素插入操作采用底层机制是insert_equal,而非insert_unique。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值