C++ min_element、max_element和minmax_element求極值演算法詳解

2020-07-16 10:04:29
algorithm 標頭檔案中定義了 3 個可以運用到序列的演算法:
  • min_element():會返回一個指向輸入序列的最小元素的疊代器;
  • max_element():會返回指向最大元素的疊代器;
  • minmax_element():會以 pair 物件的形式返回這兩個疊代器。

序列必須由正向疊代器指定,僅僅有輸入疊代器是不夠的。對於這 3 個演算法,除了序列的開始和結束疊代器,可以選擇提供第三個引數來定義比較函數。下面是將這 3 個演算法應用到整數的一些程式碼:
std::vector<int> data {2, 12, 3, 5, 17, -11, 113, 117, 19}; std::cout << "From values ";
std::copy(std::begin(data), std::end(data),std::ostream_iterator<int>{std::cout, " "});
std::cout << "n Min = " << *std::min_element(std::begin(data), std::end (data))<< " Max = " << *std::max_element (std::begin (data), std::end(data))<< std::endl;
auto start_iter = std::begin(data) + 2;
auto end_iter = std::end(data) - 2;
auto pr = std::minmax_element(start_iter, end_iter); // Get min and max
std::cout << "From values ";
std::copy(start_iter, end_iter, std::ostream_iterator<int>{std::cout, " "});
std::cout << "n Min = "<< *pr.first << " Max = " << *pr.second << std::endl;
min_element() 和 max_element() 被用來從 data 中查詢最小值和最大值。minmax_element() 會被應用到同一個序列上,但會略過前兩個和後兩個元素。執行這段程式碼會輸出下面的內容:

From values 2 12 3 5 17 -11 113 117 19
Min = -11 Max = 117
From values 3 5 17 -11 113
Min = -11 Max = 113

algorithm 標頭檔案中也定義了 min()、max()、minmax() 的函數模板,它們分別返回最小值、最大值或者兩個物件或一個物件的初始化列表的最小值和最大值。我們已經看到它們可以用來比較兩個引數。下面是一個將它們用於初始化列表的範例:
auto words = {string {"one"}, string {"two"}, string {"three"}, string {"four"}, string {"five"}, string {"six"}, string {"seven"}, string {"eight"}};
std::cout << "Min = " << std::min(words)<< std::endl;//Min = eight
auto pr = std::minmax(words, [] (const strings s1, const strings s2){return s1.back() < s2.back();});
std::cout << "Min = " << pr.first << " Max = " << pr.second<< std::endl; // Min = one Max = six
words 是 string 物件的一個初始化列表。元素都是 string 物件很重要。如果使用簡單的 char*,那麼演算法將無法正常工作,因為比較的是地址而不是 string 的內容。min() 演算法會用 string 物件預設的 operator<() 來確定 words 中的最小物件,然後用 minmax() 找出列表中最小和最大物件,minmax() 使用一個自定義的比較字串的最後一個字元的比較函數。結果顯示在註釋中。也有接受函數物件作為定義比較的最後一個引數的 min() 和 max() 版本。