代码改变世界

C++标准库关联容器

2011-10-18 14:04  马哈鱼  阅读(679)  评论(0编辑  收藏  举报

1 关联容器定义

  存储对象集合的类型,支持通过键的高效访问。和顺序容器的本质差别在于:顺序容器通过元素在容器中的位置顺序存储和访问元素,而关联容器却是依靠键。map和set是两个基本的关联容器类型,map以键值对的形式组织存储元素,而set仅存储键。

2 pair类型(在utility头文件中定义)

  a)pair类型的操作:

     pair<T1,T2> p1;创建一个空的pair对象,两个元素类型分别是T1和T2,值初始化;

     pair<T1,T2> p1(v1,v2);创建一个pair对象,具有两个元素v1和v2,类型分别是T1和T2;

     make_pair(v1,v2);以v1和v2作为值创建一个pair对象,元素类型分别是v1和v2的类型;

     p1.first;返回值为v1;

     p1.second;返回值为v2;

     p1 < p2;小于运算遵循字典次序;

     p1 == p2;如果两个pair对象的first成员和second成员依次相等,则两个pair对象相等;

  注:*pair类型属于类模板。

3 关联容器和顺序容器的操作区别

  a)共有的操作:

     C<T> c;

     C<T> c(c2);

     C<T> c(b,e);

     关系操作符;

     c.begin();

     c.end();

     c.rbegin();

     c.rend();

     size_type 

     iterator 

     const_iterator 

     reverse_iterator

     const_reverse_iterator 

     difference_type 存储两个迭代器差值的有符号整型,可为负数

     value_type 对于map,是pair 类型

     reference value_type& 的同义词

     const_reference 等效于 const value_type&

     swap和赋值操作;

     clear和erase操作;

     容器大小的操作(resize除外);

  b)关联容器不提供的操作:

     front,push_front,pop_front,back,push_back,pop_back 

4 map类型

  map类型可理解为关联数组,关联的本质在于元素的值与某个特定的键相关联,而与元素的位置无关。

  a)map对象的定义:

     map<k,v> m;创建一个空的map对象m,其键和值的类型分别为k,v;

     map<k,v> m(m2);创建m2的副本m,m必须具有和m2相同的键类型和值类型;

     map<k,v> m(b,e);创建一个map对象m,存储迭代器[b,e)标记范围内的所有元素的副本,元素类型必须能转换为pair<const k,v>;

  注:*键类型必须能够定义<操作符。

  b)map定义的类型:

     map<k,v>::key_type;键的类型

     map<k,v>::mapped_type;元素的类型

     map<k,v>::value_type;pair<const map<k,v>::key_type,map<k,v>::mapped_type>

  注:*map迭代器解引用生成pair<const map<k,v>::key_type,map<k,v>::mapped_type>类型的对象,pair对象的值成员可以修改,但键成员不能修改;

5 map容器的操作

  a)添加元素:

     m.insert(e);e为map的value_type类型的值。如果键e.first不存在,则添加一个值为e.second的值,如果存在,则m不变。该操作返回一个pair类型的对象,包含一个指向新添加元素的map迭代器,以及一个bool值,表示插入是否成功;

     m.insert(b,e);将迭代器b和e标示区间内的所有元素插入到m中,所插入的元素必须为m.value_typpe类型,返回void;

     m.insert(iter,e);如果m中不存在键e.first,则在m中以iter为起点搜索新元素的位置并插入,返回一个指向新添加元素的迭代器。

     m["zhu"] = 1;在map中查找键为"zhu"的元素,如果没有,则插入一个新的键值对,键为"zhu",值采用初始化,再将1赋给元素的值;

  b)查询元素:

     m.count(k);返回m中k键出现的次数,返回值只能是0或1;

     m.find(k);如果m中存在键为k的元素,则返回指向该元素的迭代器,否则,返回m.end();

  c)删除元素:

     m.erase(k);删除m中键为k的元素,返回值为所删除元素的个数,只能是0或1,类型为size_type;

     m.erase(p);删除m中迭代器p所指向的元素,p所指向的元素必须存在,返回void;

     m.erase(b,e);删除m中由迭代器[b,e)标示范围内的元素,[b,e)必须是有效范围,返回void。

6 set类型

  set容器单单存储键的集合。

  a)set容器不支持的操作:

     set不支持下标操作;

     没有定义mapped_type,value_type对应的是key_type,即元素的类型;

     与map一样,set容器中的键也必须唯一,而且不能修改。

  注:*set容器支持map的大部分的操作。

7 multimap和multiset

  a)元素的添加删除:

     insert 操作每次都会添加一个元素;

     erase 带有一个键参数的该操作将删除拥有该键的所有元素,返回删除的元素个数,而带有一个或一对迭代器参数,则只删除指定的元素,返回void。

  b)查找元素:

     m.count,m.find()

     m.lower_bound(k) 返回一个指向键不小于k的元素的迭代器;

     m.upper_bound(k) 返回一个指向键大于k的第一个元素的迭代器;

     m.equal_range(k) 返回一个pair对象,first成员等价于m.lower_bound(k);second成员等价于m.upper_bound(k);

  注:*三种查找方法都基于一个事实,在multimap中,同一个键所关联的元素必然相邻存放。