第十三篇:multimap容器和multiset容器中的find操作


前言

       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實現問題同樣可以使用本文所提供的兩種方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM