bool operator>(const Name& name) const { return second > name.second ||(second == name.second && first > name.first); }當然,可以將成員函數的定義放在類的外面:
inline Name::bool operator> (const Name& name) const { return second > name.second || (second == name.second && first > name.first); }現在可以用 Name 物件作為 map 的鍵,將容器中的 pair 物件按降序排列:
std::map<Name,size_t, std::greater<Name>>people{{Name{"Al", "Bedo"}, 53}, {Name{"Woody","Leave"},33},{Name{"Noah", "Lot"}, 43}};這裡第三個模板型別引數指定了用來比較鍵的函數物件的型別。greater<Name> 物件使用 > 運算子來比較 Name 物件,因為 Name 類實現了 operator>(),所以可以這樣做。這三個元素會按照降序排列。如果列出這些元素,它們的排列方式是很明顯的,可以像下面這樣列出元素:
for ( const auto& p : people) std:: cout << p.first << " " << p.second << " n";基於範圍的 for 迴圈遍歷了 people 容器中的所有元素,然後將它們輸出:
Noah Lot 43
Woody Leave 33
Al Bedo 53
// Compares keys that are unique_ptr<string> objects class Key_compare { public: bool operator () (const std::unique_ptr<string>& p1, const std::unique_ptr <string>& p2) const { return *p1 < *p2; } };可以用 Key_compare 型別作為 map 容器來比較鍵的函數物件的型別:
std::map<std::unique_ptr<string>,std::string,Key_compare> phonebook;第三個 map 模板引數指定了用來比較元素的函數物件的物件,因為這個型別引數指定了預設的值 less<T>,所以我們需要指定我們自己定義的函數物件。map 中的元素是 pair 物件,它封裝了一個指向 string 物件的智慧指標,string 物件用來儲存人名和電話。對於這個 map,我們不能使用初始化列表,因為初始化列表包含了副本,而 unique_ptr 物件是不能被複製的。我們至少有兩種向容器中新增元素的方式:
Phonebook.emplace(std::make_unique<string>("Fred"), "914 626 7897"); Phonebook.insert(std::make_pair(std::make_unique<string>("Lily"), "212 896 4337"));第一條語句在容器的適當位置直接生成了一個 pair 物件。這個 pair 物件的建構函式可以移動這裡指定的引數,所以可以無條件地複製它們。第二條語句呼叫了容器的成員函數 insert(),它會將引數元素移到容器中。
for (const auto& p: phonebook) std:: cout << *p.first << " " << p.second << std::endl;基於範圍的 for 迴圈遍歷了 map 中的所有元素,map 中的元素都是 pair 物件。每一個 pair 物件的成員變數 first 都是 unique 指標,所以不得不通過解除參照來存取它們所指向的 string 物件。如果使用疊代器來存取元素,語法略有不同:
for (auto iter = std::begin (phonebook) ;iter != std:: end (phonebook) ; ++iter) std:: cout << *iter->first << " " << iter->second << std::endl;它和之前的迴圈有相同的輸出,但使用的是疊代器。可以用 -> 運算子來存取 pair 物件的成員。因為這樣定義了偽函數 Key_compare,所以容器中的元素會被升序排列。