multimap和multiset 認知和使用

2022-01-23 06:44:49 字數 1361 閱讀 8736

之前只是在c++ primer裡面看過關聯容器,可能因為沒有實際用過,只是看看,所以導致用的時候並不熟悉;

在這之前,map和set的特性應該要了解,map是關聯陣列,也就是由鍵值對組成的,而set只是關鍵字的集合,但是兩者都只允許關鍵字是唯一的,也就是對於乙個給定的關鍵字,它只能允許乙個元素的關鍵字等於它;

但是,容器multimap和multiset並沒有這個限制,它們都允許多個元素具有相同的關鍵字。

如何訪問multimap呢,也就是如何查詢元素呢?

這個時候需要先了解multimap的函式:

find(k) 返回第乙個關鍵字為k的迭代器

count(k) 返回關鍵字等於k的個數

lower_bound(k) 返回第乙個關鍵字不小於k的元素

upper_bound(k) 返回第乙個關鍵字大於k的元素

equal_bound(k) 上面返回的是迭代器,但是這裡返回的迭代器pair,表示關鍵字等於k的元素的範圍,若k不存在,pair的兩個成員均等於end()

注意:多個相同的關鍵字儲存在容器中時,則會相鄰儲存;

根據以上的函式,可以使用三種方法進行查詢元素

第一種方法:find + count

multimapmaps;

string word("word");

//注意是第乙個出現的

auto itr = maps.find(word);

auto cnt = maps.count(word);

//迴圈便利

while (cnt)

第二種方法:lower_bound + upper_bound

multimapmaps;

string word("word");

//其實就是乙個區間,因為儲存位置連續

for (auto beg = maps.lower_bound(word), end = maps.upper_bound(word); beg != end; ++beg)

第三種方法:equal_range

multimapmaps;

string word("word");

// 和上面不一樣,直接返回乙個區間

for (auto pos = maps.equal_range(word); pos.first != maps.end(); ++pos.first)

對了還有unordered,這是沒有進行排序的,同樣的這些無序容器同樣有重複關鍵字的版本-unordered_multimap,unordered_multiset,這些是用雜湊函式實現,沒有unordered的則是用紅黑樹實現的。

multimap和map的例項

multimap的基本操作例項 include includeusing namespace std int main coutstring word hello ml.insert ml.insert make pair word,1 ml.insert pair word,2 ml.insert...

STL學習筆記7 容器set和multiset

在標頭檔案中定義 namespace std set和multiset都是關聯容器,是有序的集合,集合中包含不可重複的 型別為key的元素。排序通過使用型別為compare的比較函式比較來實現。搜尋,刪除和插入操作具有對數時間複雜度。set和multiset通常都以紅黑樹實現。multiset相對s...

STL之map和multimap總結

map c 預設建構函式 建立乙個空map multimap map c op 建立乙個空map multimap,並以op原則作為排序準則 map c c2 複製建構函式 建立乙個新的map multimap 作為c2的副本 所有元素都被複製 map c c2 複製建構函式 建立乙個新的map 作...