关联容器主要包括pair、map、set、mulitmap、multiset。
注意:
1.与顺序容器相比,关联容器不提供front、back、push_front()、push_back()、pop_back()、pop_front()等操作;且关联容器中的键类型作为key,必须定义"<"操作符,从而可以拿来比较,对其他比较运算不作要求。
2.关联容器不能通过容器大小来定义,因为不知道键值是多少。
3.提供关系运算。
4.提供begin、end、rbegin、rend等操作。
5.提供类型别名,但是value_type不同。
6.提供swap和赋值操作,但不提供assign操作。
7.提供clear和erase操作,但只返回void类型而不是下一元素迭代器。
8.提供容器大小操作,但没有resize操作。
1.pair类型
#include <utility>
pair<T1, T2> p;
pair<T1, T2> p(v1, v2);
pair<T1, T2> p = make_pair(v1, v2);
p1 == p2
p1 < p2 //按照字典序,先比较v1,再比较v2
p.first
p.second
2.map类型
C<T1, T2> c;
C<T1, T2> c1(c2); //c1和c2必须有相同的键类型和值类型
C<T1, T2> c(b, e); //只要求兼容
C<T1, T2>::size_type
C<T1, T2>::iterator
C<T1, T2>::const_iterator
C<T1, T2>::reverse_iterator
C<T1, T2>::const_reverse_iterator
C<T1, T2>::value_type //pair类型,first元素是const C<T1, T2>::key_type类型,second元素是C<T1, T2>::mapped_type类型
C<T1, T2>::key_type
C<T1, T2>::mapped_type
C<T1, T2>::iterator c.begin();
C<T1, T2>:::iterator c.end();
C<T1, T2>::iterator c.rbegin();
C<T1, T2>::iterator c.rend();
m[key] //用下标访问不存在的元素会添加新的元素(key, 初始化值)
m[key] = value; //用下标修改不存在的元素会添加新的元素(key, value)
int m.count(key); //key出现的次数,0或者1
iterator m.find(key); //返回对应的迭代器或者超出末端迭代器,不会如[]一样添加
pair<iterator, bool> m.insert(e); //e.first不存在,则插入e.second,e.fist存在,则不变
void m.insert(b, e);
C<T1, T2>::iterator m.insert(iter, e); //iter作为起点搜索,返回指向e的迭代器
c1 = c2;
void c1.swap(c2);
C<T1, T2>::size_type c.size();
bool c.empty();
void c.clear();
C<T1, T2>::size_type m.erase(key); //返回删除的个数
void m.erase(p);
void m.erae(b, e);
3.set类型
set容器支持大部分的map操作,包括下面几种:
A.关联容器通用操作。
B.map的构造函数。
C.map的insert操作。
D.map的count和find操作。
E.map的erase操作。
F.不支持下标操作符。
G.不支持mapped_type类型,其value_type不是pair类型,而是与key_type相同的类型,且键值必须唯一。
4.multimap和multiset类型
multimap和multiset所支持的操作分别与map和set操作相同,只有一个例外,就是multimap不支持下标运算,因为其某个键值对应多个值;且即使是相同的操作,也做了一定的修改。
inert和erase:
每次调用insert必然会添加一个元素,因为键值不是唯一的。
带有一个键值的erase版本将删除该键的所有元素,并返回删除个数;带有一个或一对迭代器的版本只删除指定的元素,并返回void类型。
find和count:
map和set是顺序存储的,multimap和multiset也一样,且如果某个键对应多个实例,这些实例在容器中相邻存放。
count返回某键对应元素出现的次数,而find操作返回某键值的第一个实例或者end()。
lower_bound和upper_bound:
iterator lower_bound(key) //返回指向键值不小于key的第一个元素的迭代器
iterator upper_bound(key) //返回大于key的第一个元素的迭代器
pair<iterator, iterator> equal_range(key) //返回pair类型,first成员等价于lower_bound(key),second成员等价于upper_bound(key)
注意:lower_bound返回的迭代器不一定指向拥有特定键值的元素,如果该键值不存在,则lower_bound返回该键值应该被插入的第一个位置。这两个键不会说明键值是否存在,只是给出了某一区域。