之前只是在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 作...