STL 關聯容器

2021-06-22 08:47:12 字數 2311 閱讀 7492

1、關聯容器與順序容器的本質區別

關聯容器通過鍵(key)儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。

2、關聯容器的型別

map 、set、multimap、multiset

3、pair型別

pair型別的比較: p1

p1 == p2: 如果兩個pair物件的first和second成員依次相等,則這兩個物件相等,(該運算使用其元素的==操作符)

4、map型別

mapm; //建立空的map物件,其鍵和值得型別分別為k和v;

mapm(m2);

mapm(b,e);

注意:鍵值應能夠比較

map::key_type   //在map中,用作索引的鍵的型別

注意:map的value_type是pair型別,它的值成員可以修改,但鍵成員不能修改(型別為const map::key_type,唯讀)。

map迭代器進行解引用將產生pair型別的物件

<1>、map型別的操作

**1、通過下標訪問map物件

注意:用下標訪問不存在的元素將導致在map容器中新增乙個新的元素,它的鍵即為該下標值。

例:mapword_count;

word_count["anna"] = 1;

將有以下操作:

在word_count中查詢鍵為anna的元素,沒有找到;

將乙個新的鍵-值對插入到word_count中,它的鍵是const string型別,儲存為anna, 而它的值初始化為0;

讀取新插入的元素,並將它的值賦為1;

map下標操作返回的左值是特定鍵所關聯的值。

<2>、map::insert的使用

注意insert的返回值;

是乙個pair型別,first成員是map迭代器,second成員是bool型,first成員指向map中已存在的值,second標識插入操作是否成功。

<3>、查詢操作

m.count(k);//返回m中k鍵出現的次數。

m.find(k);//查詢m容器中是否存在k鍵,存在返回指向該元素的迭代器,不存在,返回超出末端的迭代器。

<4>、從map中刪除元素

m.erase(k);//刪除m中鍵為k的元素,返回size_type型別的值,表示刪除的元素的個數。

m.erase(p);//從m中刪除迭代器p所指向的元素。p必須指向m中確實存在的元素,而且不能等於m.end(),返回void型別。

m.erase(b,e);//從m中刪除一段範圍內的元素,該範圍由迭代器對b和e標記。b和e必須標記m中的一段有效範圍。返回void型別。

5、set型別

map是鍵-值對的集合,set容器是單純的鍵的集合

set支援大部分的map操作,但是set不支援下標操作符,set容器中儲存的鍵必須為唯一的,而且不能修改。

6、multimap和multiset型別

1**、注意multimap不支援下標操作(因為某個鍵可能對應多個值)

2**、在multimap和multiset中,如果某個鍵對應多個例項,則這些例項在容器中將相鄰存放。

3**、在multimap和multiset中查詢元素所使用的三種方法

<1>、find和count

<2>、lower_bound和upper_bound

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);

在同乙個鍵上呼叫lower_bound和upper_bound,將產生乙個迭代器範圍,指示出該鍵所關聯的所有元素。

如果查詢的鍵不在multimap中,則這兩個操作將返回同乙個迭代器,指向依據元素的排列順序該鍵應該插入的位置。 例:

typedef multimap::iterator author_it;

author_it beg = author.lower_bound("barth,john");

author_it end = author.upper_bound("barth,john");

while(beg != end)

{ cout、equal_range函式

pairpos = author.equal_range("barth,john");

while(pos.first != pos.second)

{ cout

stl 關聯容器

簡介 對於關聯容器,它的每個元素都有乙個鍵 key 容器中的元素的順序並不能人為隨意決定,而是按照鍵的取值公升序排列的。也就是說,對於乙個關聯容器s,使用迭代器在 s.begin s.end 區間內遍歷,訪問到的序列總是公升序的。分類 按照容器中是否允許出現重複鍵值,關聯容器可分為單重關聯容器和多重...

STL 關聯容器

c primer 第11章 關聯容器和順序容器有根本的不同 關聯容器中的元素是按關鍵字來儲存和訪問的。關聯容器型別 分為有序和無序 有序 map 關聯陣列 儲存鍵值對 set 關鍵字即值,即只儲存關鍵字的容器 multimap 關鍵字可重複出現的map multiset 關鍵字可重複出現的set 無...

STL關聯容器

這裡簡單學習一下stl關聯容器,主要是map multimap set multiset以及unordered map。前四個底層實現都是利用紅黑樹實現的,查詢演算法時間複雜度為 o log n 而unordered map從名字上就知道是無序容器,其實現原理類似雜湊表,查詢演算法時間複雜度 o 1...