C++ STL 之 multimap

閱讀此篇前若有需要請先參看 C++ STL 容器 map 的介紹。

map 中不允許存在相同的元素,而 multimap 允許。這一設計上改變也帶來一些使用上的不同。

訪問 multimap 中的元素

由於 multimap 中允許存在關鍵字值相同的元素。因此我們很難想象通過下標訪問會發生什麼,實際上 multimap 並不允許通過下標來訪問其中的元素。由於 map 中的元素是依照 index 的遞增順循序排列的,multimap 依然保持了這一特性,因此在 multimap 中具有相同 index 值的元素會相鄰存儲。這裏提供三種解決方案:

**使用 .find 結合 .count **

我們可以先是用 .find 找出第一個匹配 index 值的元素的迭代器,再利用 .count 得到該 multimap 中一共有多少個具有該 index 值的元素。

multimap<char, int> mm = {{'a', 1}, {'a', 2}, {'b', 3}};
auto it = mm.find('a');//it = mm.begin()
int size = mm.count('a');//size = 2
while (size > 0) {
    cout << it->second << " ";
    size--;
} // 輸出:1 2

使用 .lower_bound 和 .upper_bound

.lower_bound 返回 multimap 中第一個關鍵字不小於給定值元素的迭代器

.upper_bound 返回 multimap 中第一個關鍵字大於給定值元素的迭代器

multimap<char, int> mm = {{'a', 1}, {'a', 2}, {'b', 3}};
auto b = mm.lower_bound('a');//it = mm.begin()
auto e = mm.upper_bound('a');//size = 2
for (auto it=b; it!=e; it++) {
    cout << it->second << " ";
}
// 輸出:1 2

即 .lower_bound 和 .upper_bound 的返回的是一個關於查找關鍵字的左閉右開區間

[ .lower_bound, .ipper_bound )

當 .lower_bound 與 .ipper_bound 值相等時,意爲 multimap 中不存在具有該關鍵字的元素。

使用 .equal_range 函數

.equal_range 會返回一個 pair,此 pair 的第一個成員即是 .lower_bound 的返回值;第二個成員即是 .upper_bound 的返回值。

multimap<char, int> mm = {{'a', 1}, {'a', 2}, {'b', 3}};
auto p = mm.equal_ragne('a'); // 
for (auto it=p.first; it!=p.second; it++) {
   cout << it->second << " ";
}
// 輸出:1 2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章