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中,同一个键所关联的元素必然相邻存放。