template < class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class multimap
{
...
typedef pair <const Key, T> value_type;
...
};
<
運算子比較大小。multimap 允許多個元素的關鍵字相同。成員函數或成員函數模板 | 作 用 |
---|---|
iterator find( const Key & val); | 在容器中查詢關鍵字等於 val 的元素,返回其疊代器;如果找不到,返回 end() |
iterator insert (pair <Key, T> const &p); | 將 pair 物件 p 插入容器中並返回其疊代器 |
void insert(iterator first, iterator last); | 將區間 [first, last) 插入容器 |
int count( const Key & val); | 統計有多少個元素的關鍵字和 val 相等 |
iterator lower_bound( const Key & val); | 查詢一個最大的位置 it,使得 [begin( ), it) 中所有的元素的關鍵字都比 val 小 |
iterator upper_bound(const Key & val); | 查詢一個最小的位置 it,使得 [it, end()) 中所有的元素的關鍵字都比 val 大 |
pair < iterator, iterator > equal_range (const Key & val); | 同時求得 lower_bound 和 upper_bound |
iterator erase(iterator it); | 刪除 it 指向的元素,返回其後面的元素的疊代器(Visual Studio 2010 中如此,但是在 C++ 標準和 Dev C++ 中,返回值不是這樣) |
iterator erase(iterator first, iterator last); | 刪除區間 [first, last),返回 last(Visual Studio 2010 中如此,但是在 C++ 標準和 Dev C++ 中,返回值不是這樣) |
==
運算子比較兩個關鍵字是否相等。如果x比y小
和y比x小
同時為假,就認為 x 和 y 相等。#include <iostream> #include <map> //使用multimap需要包含此標頭檔案 #include <string> using namespace std; class CStudent { public: struct CInfo //類的內部還可以定義類 { int id; string name; }; int score; CInfo info; //學生的其他資訊 }; typedef multimap <int, CStudent::CInfo> MAP_STD; int main() { MAP_STD mp; CStudent st; string cmd; while (cin >> cmd) { if (cmd == "Add") { cin >> st.info.name >> st.info.id >> st.score; mp.insert(MAP_STD::value_type(st.score, st.info)); } else if (cmd == "Query") { int score; cin >> score; MAP_STD::iterator p = mp.lower_bound(score); if (p != mp.begin()) { --p; score = p->first; //比要查詢分數低的最高分 MAP_STD::iterator maxp = p; int maxId = p->second.id; for (; p != mp.begin() && p->first == score; --p) { //遍歷所有成績和score相等的學生 if (p->second.id > maxId) { maxp = p; maxId = p->second.id; } } if (p->first == score) { //如果上面的迴圈因為 p == mp.begin() //而終止,則p指向的元素還要處理 if (p->second.id > maxId) { maxp = p; maxId = p->second.id; } } cout << maxp->second.name << " " << maxp->second.id << " " << maxp->first << endl; } else //lower_bound 的結果就是 begin,說明沒有分數比查詢分數低 cout << "Nobody" << endl; } } return 0; }multimap 容器中的元素必須是 pair 類別範本物件。本題需要用 multimap 來存放學生資訊,然而學生資訊由三部分組成:姓名、學號、分數,解決的辦法就是將用於排序的 score 作為一個成員變數,而且把其他部分一起作為一個 CInfo 物件,這樣,第 16 行範例化出來的類 multimap <int, CStudent::CInfo> 中的元素的型別就會是如下 pair 模板類:
class pair <int, CStudent::CInfo>
{
int first; //對應於CStudent::score
CStudent::CInfo second; //對應於 CStudent::info
};
mp.insert( MAP_STD::value_type(st.score, st.info) );
參看 multimap 的定義,MAP_STD::value_type 就是容器中元素的型別,該型別是 pair <int, CStudent::CInfo>。型別名後面跟建構函式的參數列就代表一個物件。因此,此條語句生成了一個 pair <int, CStudent::CInfo> 物件並將其插入 multimap 容器中。該物件內部存放的資訊和 st 相同,first 對應於 st.score,second 對應於 st.info。