map所开放的各种接口操作,RB-Tree也都提供了,因此几乎所有的map的操作只是转用RB-Tree的操作行为。

    1. template <class Key, class T,
    2. class Compare = less<Key>,
    3. class Alloc = alloc>
    4. class map {
    5. public:
    6. //typedef
    7. typedef Key key_type; //键值型别
    8. typedef T data_type;
    9. typedef T mapped_type;
    10. typedef pair<const Key, T> value_type;
    11. typedef Compare key_compare;
    12. //以下定义一个functor,其作用就是调用“元素比较函数”
    13. class value_compare
    14. : public binary_function<value_type, value_type, bool> {
    15. friend class map<Key, T, Compare, Alloc>;
    16. protected:
    17. Compare comp;
    18. value_compare(Compare c) : comp(c) {}
    19. public:
    20. bool operator()(const value_type& x, const value_type& y) const {
    21. return comp(x.first, y.first);
    22. }
    23. };
    24. private:
    25. typedef rb_tree<key_type, value_type, select1st<value_type>, key_compare, Alloc>rep_type;
    26. rep_type t;
    27. public:
    28. typedef typename rep_type::pointer pointer;
    29. typedef typename rep_type::const_pointer const_pointer;
    30. typedef typename rep_type::reference reference;
    31. typedef typename rep_type::const_reference const_reference;
    32. typedef typename rep_type::iterator iterator; //允许用户通过迭代器修改元素的值
    33. typedef typename rep_type::const_iterator const_iterator;
    34. typedef typename rep_type::reverse_iterator reverse_iterator;
    35. typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
    36. typedef typename rep_type::size_type size_type;
    37. typedef typename rep_type::difference_type difference_type;
    38. //map一直使用的是底层RB-tree的insert_unique(),而非insert_equal()
    39. map() : t(Compare()) {}
    40. explicit map(const Compare& comp) : t(comp) {}
    41. template <class InputIterator>
    42. map(InputIterator first, InputIterator last)
    43. : t(Compare()) {t.insert_unique(first, last);}
    44. template <class InputIterator>
    45. map(InputIterator first, InputIterator last, const Compare& comp)
    46. : t(comp) {t.insert_unique(first, last);}
    47. map(const map<Key, T, Compare, Alloc>& x) : t(x.t){}
    48. map<Key, T, Compare, Alloc>& operator=(const map<Key, T, Compare, Alloc>& operator=
    49. (const map<Key, T, Compare, Alloc>& x))
    50. {
    51. t = x.t;
    52. return *this;
    53. }
    54. }