关联容器 — map
最后更新于:2022-04-01 19:54:19
和set类似,也采用了rb_tree作为底层容器,但每个节点是一个pair对象,它关联了键值和实值。键值不允许修改,但实值是可以修改的,等下的代码也会有所说明。
下面是map的代码框架:
~~~
template , class Alloc = alloc> // 默认采用递增顺序
class map {
public:
typedef Key key_type; // 键值类型
typedef T data_type; // 实值类型
typedef T mapped_type;
typedef pair value_type; // 注意const Key,表示无法修改键值
typedef Compare key_compare;
....
private:
// select1st抽取出value_type(pair)内的first元素
typedef rb_tree, key_compare, Alloc> rep_type;
rep_type t; // 底层容器——红黑树
public:
....
typedef typename rep_type::iterator iterator; // 实值可以修改
....
map() : t(Compare()) {}
explicit map(const Compare& comp) : t(comp) {}
....
key_compare key_comp() const { return t.key_comp(); }
value_compare value_comp() const { return value_compare(t.key_comp()); }
iterator begin() { return t.begin(); }
const_iterator begin() const { return t.begin(); }
iterator end() { return t.end(); }
....
// 下标操作,存在相同键值的节点则返回,否则插入再返回
// insert返回pair,iterator指向红黑树的某个节点
// 下标操作返回迭代器的第二个元素,即实值
T& operator[](const key_type& k) {
return (*((insert(value_type(k, T()))).first)).second;
}
// 插入/删除
pair insert(const value_type& x) { return t.insert_unique(x); }
iterator insert(iterator position, const value_type& x) {
return t.insert_unique(position, x);
}
....
// map相关操作
iterator find(const key_type& x) { return t.find(x); }
size_type count(const key_type& x) const { return t.count(x); }
iterator upper_bound(const key_type& x) {return t.upper_bound(x); }
pair equal_range(const key_type& x) {
return t.equal_range(x);
}
friend bool operator== __STL_NULL_TMPL_ARGS (const map&, const map&);
friend bool operator< __STL_NULL_TMPL_ARGS (const map&, const map&);
};
~~~
参考:
《STL源码剖析》 P237.
';