關聯容器主要包括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返回該鍵值應該被插入的第一個位置。這兩個鍵不會說明鍵值是否存在,只是給出了某一區(qū)域。