STL set使用红黑树作为实现方式 -(这样做的原因是为了具有统一的插入时间;没有像哈希映射那样的线性最坏情况);如果更改键,则树将不再平衡;该实现使用operator<和operator==,而不是哈希。
unordered set使用桶哈希表作为实现方式;这里使用了哈希;更改键意味着条目将不再属于哈希表的同一个桶。
shared_ptr的operator<和operator==比较智能指针持有的指针值,但更改键将无法维护实现此“容器”的数据结构的排序关系。
共享指针的哈希值将仅是包装指针的数值。
template<typename _Tp, _Lock_policy _Lp>
struct hash<__shared_ptr<_Tp, _Lp>>
: public std::unary_function<__shared_ptr<_Tp, _Lp>, size_t>
{
size_t
operator()(const __shared_ptr<_Tp, _Lp>& __s) const
{ return std::hash<_Tp*>()(__s.get()); }
};
template<typename _Tp>
struct hash<_Tp*> : public __hash_base<size_t, _Tp*>
{
size_t
operator()(_Tp* __p) const
{ return reinterpret_cast<size_t>(__p); }
};
关于gcc stl:
c++/<version>/map inculudes c++/<version>/bits/stl_set.h
c++/<version>/bits/stl_set.h
template<typename _Key, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<_Key> >
class set
{
typedef _Rb_tree<key_type, value_type, _Identity<value_type>,
key_compare, _Key_alloc_type> _Rep_type;
_Rep_type _M_t; // Red-black tree representing set.
c++/<version>/bits/tree.h
<here red black tre _Rb_tree class is implemented>
c++/<version>/unordered_set includs c++/<version>/bits/unordered_set.h this one uses hashtable in c++/<version>/bits/hashtable.h
unordered_set
比set
更有意义) - leemes