關聯容器主要包括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ū)域。