前面我们讲到set/multiset 的
key就是数据本身,他们是一样的,STL为了禁止我们对key进行修改,最终采用了红黑树的const_iterator
key就是数据本身,他们是一样的,STL为了禁止我们对key进行修改,最终采用了红黑树的const_iterator
接下来要学习的map,同样的不允许我们去修改一个key,但是无论是map还是key可以重复的multimap他们的key和data就不是同一回事了,key虽然不能修改但是data允许修改,这里并没有用到const_iterator,而是再对key和map进行pair打包时,->
pair
没错是给key加上了const属性。
pair
没错是给key加上了const属性。
map源码:
template < class key,
//key的类型
//key的类型
class T ,
//data的类型
class compare =
less, //排序是按key来比较的
class Alloc = alloc>
class map
{
public:
typedef key
key_type;
typedef T
data_type;
//从这里可以看出,map的key和对应数据类型是独立的
typedef T
mapped_type;
typedef
pair value_type; // 在对key和data进行打包时,赋予key
const属性,所有不能修改
typedef
compare
key_compare; //比较时,是按照可以、来操作的
private:
typedef
rb_tree ,key_compare,alloc> rep_type;
//从这里可以看出,map底层很简单,就是一颗红黑树
rep_type
t;
public:
typedef typename rep_type ::
iterator iterator ;
};
select1st:从一坨东西中拿出第一个,即取出pair中的key,是一个函数对象
map中的一个特殊的运算符重载函数:operator[]
operator [] (const key_type &k)
{
1.如果对应的key存在,那么就将key对应的数据返回回去
2.如果key不存在,会创建这样一个节点出来,并且按照有序的顺序安插到红黑树中。
}
map的key必须是独一无二的,因此当我们调用insert()时,调用了红黑树底层的insert_unique();
而multimap的key是可以重复的,因此我们给multiset中insert()时,实际调用了红黑树的insert_equal();
使用上来讲: