关联容器主要包括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返回该键值应该被插入的第一个位置。这两个键不会说明键值是否存在,只是给出了某一区域。