之前只是在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的則是用紅黑樹實現的。