- 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。