前言
multimap容器是map容器的“ 增強版 ”,它允許一個鍵對應多個值。對於map容器來說,find函式將會返回第一個鍵值匹配元素所在處的迭代器。那麼對於multimap容器來說,find函式將如何運作呢?如果要實現和map容器的find函式同樣的功能,則它將返回多個迭代器,這樣太複雜了。本文將講解C++中multimap容器的“ find實現 ”。
解決思路一
摒棄find函式,使用另外兩個新函式,它們是專家們為了解決multimap中的“ find操作 ”問題專門設計的:
1. lower_bound():返回一個迭代器,指向鍵不小於k的第一個元素。
2. upper_bound():返回一個迭代器,指向鍵大於k的第一個元素。
程式碼示例
下面這段程式碼首先建立一個multimap容器並賦以相關值,然後檢索其中某個鍵,最後輸出其對應的所有值:
1 #include <iostream> 2 #include <map> 3 #include <string> 4 5 using namespace std; 6 7 int main() 8 { 9 multimap<string, string> book; 10 11 /* 12 * multimap容器是不支援下標操作的,因為沒有實際意義。 13 * 故我們採取呼叫insert函式的方法給容器賦值。 14 */ 15 book.insert(make_pair("金庸", "倚天屠龍記")); 16 book.insert(make_pair("金庸", "射鵰英雄傳")); 17 book.insert(make_pair("金庸", "笑傲江湖")); 18 book.insert(make_pair("古龍", "楚留香傳奇")); 19 book.insert(make_pair("古龍", "陸小鳳傳奇")); 20 book.insert(make_pair("黃易", "邊荒傳說")); 21 22 /* 23 * 使用lower_bound()和upper_bound()獲取指向鍵值匹配元素下界和上界的迭代器 24 */ 25 multimap<string, string>::iterator bookit1, bookit2; 26 bookit1 = book.lower_bound("古龍"); 27 bookit2 = book.upper_bound("古龍"); 28 29 /* 30 * 列印檢索結果 31 */ 32 cout << "作者: " << bookit1->first << endl << "書名:" << endl; 33 while (bookit1 != bookit2) { 34 cout << bookit1->second << " "; 35 bookit1++; 36 } 37 cout << endl; 38 39 return 0; 40 }
執行結果:
解決思路二
依然摒棄find函式,使用equal函式。它也是專家們為了解決multimap中的“ find操作 ”問題專門設計的。它返回的是一個pair物件,其first成員返回指向匹配元素上界的迭代器,second成員則返回指向匹配元素下界的迭代器。
程式碼示例
和解決思路一程式碼示例一樣,下面這段程式碼首先建立一個multimap容器並賦以相關值,然後檢索其中某個鍵,最後輸出其對應的所有值:
1 #include <iostream> 2 #include <map> 3 #include <utility> 4 #include <string> 5 6 using namespace std; 7 8 int main() 9 { 10 multimap<string, string> book; 11 12 /* 13 * multimap容器是不支援下標操作的,因為沒有實際意義。 14 * 故我們採取呼叫insert函式的方法給容器賦值。 15 */ 16 book.insert(make_pair("金庸", "倚天屠龍記")); 17 book.insert(make_pair("金庸", "射鵰英雄傳")); 18 book.insert(make_pair("金庸", "笑傲江湖")); 19 book.insert(make_pair("古龍", "楚留香傳奇")); 20 book.insert(make_pair("古龍", "陸小鳳傳奇")); 21 book.insert(make_pair("黃易", "邊荒傳說")); 22 23 /* 24 * 使用equal_range函式獲取指向鍵值匹配元素下界和上界的迭代器 25 */ 26 typedef multimap<string, string>::iterator bookit; 27 pair<bookit, bookit> p = book.equal_range("古龍"); 28 29 /* 30 * 列印檢索結果 31 */ 32 cout << "作者: " << p.first->first << endl << "書名:" << endl; 33 while (p.first != p.second) { 34 cout << p.first->second << " "; 35 p.first++; 36 } 37 cout << endl; 38 39 return 0; 40 }
執行結果:
說明
multiset容器的find實現問題同樣可以使用本文所提供的兩種方法。