基礎語法之五:multimap和multiset

1、multimap和multiset 認知和使用

之前只是在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()

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

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

1.1 第一種方法:find + count

multimap<string, int> maps;
string word("word");
//注意是第一個出現的
auto itr = maps.find(word);
auto cnt = maps.count(word);
//循環便利
while (cnt) {
   
cout << itr->second << endl;
    ++itr;
    cnt--;
}
   

1.2 第二種方法:lower_bound + upper_bound

multimap<string, int> maps;
string word("word");
//其實就是一個區間,因爲存儲位置連續
for (auto beg = maps.lower_bound(word), end = maps.upper_bound(word); beg != end; ++beg) {
   
cout << beg->second << endl;
}

1.3 第三種方法:equal_range

multimap<string, int> maps;
string word("word");
// 和上面不一樣,直接返回一個區間
for (auto pos = maps.equal_range(word); pos.first != maps.end(); ++pos.first) {
   
cout << pos.first->second << endl;
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章