Post

C++ STL Container Map and MultiMap

C++ STL Container Map and MultiMap

Map and MultiMap

  • based on gnu 2.9
  • 底层用红黑树实现(RB Tree)
  • 不同点在于使用rb tree::insert_unique/rb tree::insert_equal
  • 并且multimap不支持[]访问元素, 其他相同

Map

Container

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
    typedef Key key_type;
    typedef T data_type;
    typedef T mapped_type;
    typedef Compare key_compare;

    typedef typename rep_type::pointer pointer;
    typedef typename rep_type::const_pointer const_pointer;
    typedef typename rep_type::reference reference;
    typedef typename rep_type::const_reference const_reference;
    typedef typename rep_type::iterator iterator;
    typedef typename rep_type::const_iterator const_iterator;
    typedef typename rep_type::reverse_iterator reverse_iterator;
    typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
    typedef typename rep_type::size_type size_type;
    typedef typename rep_type::difference_type difference_type;
*/
template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>
class map {
    // 包装Compare
    class value_compare 
        : public binary_function<value_type, value_type, bool> {
    friend class map<Key, T, Compare, Alloc>;
    protected :
        Compare comp;
        value_compare(Compare c) : comp(c) {}
    public:
        bool operator()(const value_type& x, const value_type& y) const {
            return comp(x.first, y.first);
        }
    };
    // value是一个pair
    typedef pair<const Key, T> value_type;
    // 与set的不同, 从value中提取key的方式不同
    // select1st<value_type>
    typedef rb_tree<key_type, value_type, 
                  select1st<value_type>, key_compare, Alloc> rep_type;
    rep_type t;  // red-black tree representing map

    // accessors
    key_compare key_comp() const { return t.key_comp(); }
    value_compare value_comp() const { return value_compare(t.key_comp()); }
    // iterator
    iterator begin() { return t.begin(); }
    const_iterator begin() const { return t.begin(); }
    iterator end() { return t.end(); }
    const_iterator end() const { return t.end(); }
    reverse_iterator rbegin() { return t.rbegin(); }
    const_reverse_iterator rbegin() const { return t.rbegin(); }
    reverse_iterator rend() { return t.rend(); }
    const_reverse_iterator rend() const { return t.rend(); }
    // size
    bool empty() const { return t.empty(); }
    size_type size() const { return t.size(); }
    size_type max_size() const { return t.max_size(); }
    // 访问
    T& operator[](const key_type& k) {
        // 通过[]访问, 如何key不存在就insert
        return (*((insert(value_type(k, T()))).first)).second;
    }
    // 插入
    // rb tree::insert_unique
    pair<iterator,bool> insert(const value_type& x) { return t.insert_unique(x); }
    iterator insert(iterator position, const value_type& x) { return t.insert_unique(position, x); }
    // 删除
    // rb tree::erase
    void erase(iterator position) { t.erase(position); }
    size_type erase(const key_type& x) { return t.erase(x); }
    // 查找
    // rb tree::find
    iterator find(const key_type& x) { return t.find(x); }
    // rb tree::count
    size_type count(const key_type& x) const { return t.count(x); }
    // rb tree::lower_bound
    iterator lower_bound(const key_type& x) {return t.lower_bound(x); }
    // rb tree::upper_bound
    iterator upper_bound(const key_type& x) {return t.upper_bound(x); }
}

MultiMap

Container

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
    typedef Key key_type;
    typedef T data_type;
    typedef T mapped_type;
    typedef Compare key_compare;

    typedef typename rep_type::pointer pointer;
    typedef typename rep_type::const_pointer const_pointer;
    typedef typename rep_type::reference reference;
    typedef typename rep_type::const_reference const_reference;
    typedef typename rep_type::iterator iterator;
    typedef typename rep_type::const_iterator const_iterator; 
    typedef typename rep_type::reverse_iterator reverse_iterator;
    typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
    typedef typename rep_type::size_type size_type;
    typedef typename rep_type::difference_type difference_type;
*/
template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>
class multimap {
    typedef pair<const Key, T> value_type;
    // select1st<value_type>
    typedef rb_tree<key_type, value_type, 
                  select1st<value_type>, key_compare, Alloc> rep_type;
    rep_type t;  // red-black tree representing multimap

    // iterator
    iterator begin() { return t.begin(); }
    const_iterator begin() const { return t.begin(); }
    iterator end() { return t.end(); }
    const_iterator end() const { return t.end(); }
    reverse_iterator rbegin() { return t.rbegin(); }
    const_reverse_iterator rbegin() const { return t.rbegin(); }
    reverse_iterator rend() { return t.rend(); }
    const_reverse_iterator rend() const { return t.rend(); }
    // size
    bool empty() const { return t.empty(); }
    size_type size() const { return t.size(); }
    size_type max_size() const { return t.max_size(); }
    // 访问
    // multimap不支持[]访问元素

    // 插入
    // rb tree::insert equal
    iterator insert(const value_type& x) { return t.insert_equal(x); }
    iterator insert(iterator position, const value_type& x) { return t.insert_equal(position, x); }
    // 删除
    // rb tree::erase
    void erase(iterator position) { t.erase(position); }
    size_type erase(const key_type& x) { return t.erase(x); }
    // 查找
    // rb tree::find
    iterator find(const key_type& x) { return t.find(x); }
    // rb tree::count
    size_type count(const key_type& x) const { return t.count(x); }
    // rb tree::lower_bound
    iterator lower_bound(const key_type& x) {return t.lower_bound(x); }
    // rb tree::upper_bound
    iterator upper_bound(const key_type& x) {return t.upper_bound(x); }
}
This post is licensed under CC BY 4.0 by the author.