<
運算子。 std::vector<int> numbers {99, 77, 33, 66, 22, 11, 44, 88}; std::sort(std::begin(numbers), std::end(numbers)); std::copy(std::begin(numbers), std::end(numbers),std:: ostream_iterator<int> {std::cout," "}) ; // Output: 11 22 33 44 66 77 88 99sort() 呼叫將 number 容器的全部元素排成升序,然後用 copy() 演算法輸出結果。可以不必對容器的全部內容進行排序。下面這條語句對 numbers 中除了第一個和最後一個元素之外的元素進行了排序:
std::sort(++std::begin(numbers),--std::end(numbers));為了將元素排成降序,需要提供一個用來比較元素的函數物件,作為 sort() 的第三個引數:
std::sort(std::begin(numbers), std::end(numbers), std::greater<>());這個比較函數必須返回布林值,而且有兩個引數,它們要麼是疊代器解除參照後得到的型別,要麼是疊代器解除參照後可以隱式轉換成的型別。引數可以是不同型別的。只要比較函數滿足這些條件,它就可以是你喜歡的任何樣子,也包括 lambda 表示式。例如:
std::deque<string> words { "one", "two", "nine", "nine", "one", "three", "four", "five", "six" }; std::sort(std::begin(words), std::end(words),[](const string& s1, const string& s2) { return s1.back()> s2.back();}); std::copy(std::begin(words), std::end(words), std::ostream_iterator<string> {std::cout," "}); // six four two one nine nine one three five這段程式碼對 deque 容器 words 中的 string 元素進行了排序,並且輸出了排序後的結果。這裡的比較函數是一個 lambda 表示式,它們用每個單詞的最後一個字母來比較排序的順序。結果元素以它們最後一個字母的降序來排序。
#ifndef NAME_H #define NAME_H #include <string> // For string class class Name { private: std::string first {}; std::string second {}; public: Name(const std::string& name1, const std::string& name2) : first(name1), second(name2){} Name()=default; std::string get_first() const { return first; } std::string get_second() const { return second; } friend std::istream& operator>>(std::istream& in, Name& name); friend std::ostream& operator<<(std::ostream& out, const Name& name); }; // Stream input for Name objects inline std::istream& operator>>(std::istream& in, Name& name) { return in >> name.first >> name.second; } // Stream output for Name objects inline std::ostream& operator<<(std::ostream& out, const Name& name) { return out << name.first << " " << name.second; } #endif這個流插入和提取運算子被定義為 Name 物件的友元函數。可以將 operator<() 定義為類的成員函數,但為了展示如何為 sort() 演算法指定比較函數引數,這裡沒有定義它。下面是程式程式碼:
// Sorting class objects #include <iostream> // For standard streams #include <string> // For string class #include <vector> // For vector container #include <iterator> // For stream and back insert iterators #include <algorithm> // For sort() algorithm #include "Name.h" int main() { std::vector<Name> names; std::cout << "Enter names as first name followed by second name. Enter Ctrl+Z to end:"; std::copy(std::istream_iterator<Name>(std::cin), std::istream_iterator<Name>(),std::back_insert_iterator<std::vector<Name>>(names)); std::cout << names.size() << " names read. Sorting in ascending sequence...n"; std::sort(std::begin(names), std::end(names), [](const Name& name1, const Name& name2) {return name1.get_second() < name2.get_second(); }); std::cout << "nThe names in ascending sequence are:n"; std::copy(std::begin(names), std::end(names), std::ostream_iterator<Name>(std::cout, "n")); }main() 中的一切幾乎都是使用 STL 模板完成的。names 容器用來儲存從 cin 讀入的姓名。輸入由 copy() 演算法執行,它使用一個 istream_iterator<Name> 範例讀入 Name 物件。 istream_iterator<Name> 預設的建構函式會建立流的結束疊代器。copy() 函數用 back_insert_iterator<Name>() 建立的 back_inserter<Name> 疊代器將輸入的每個物件複製到 names 中。為 Name 類過載的流運算子允許使用流疊代器來輸入和輸出 Name 物件。
Enter names as first name followed by second name. Enter Ctrl+Z to end:
Jim Jones
Bill Jones
Jane Smith
John Doe
Janet Jones
Willy Schaferknaker
^Z
6 names read. Sorting in ascending sequence...
The names in ascending sequence are:
John Doe
Jim Jones
Bill Jones
Janet Jones
Willy Schaferknaker
Jane Smith