來自 C++ 中 STL 的 std::min_element 演算法

Jinku Hu 2023年10月12日
  1. 使用 std::min_element 演算法在 C++ 中查詢範圍中的最小元素
  2. 使用 std::minmax_element 演算法查詢範圍內的最小元素和最大元素
來自 C++ 中 STL 的 std::min_element 演算法

本文將解釋如何在 C++ 中使用 STL 中的 std::min_element 演算法。

使用 std::min_element 演算法在 C++ 中查詢範圍中的最小元素

STL 演算法包括可以對容器範圍進行操作的通用最小/最大搜尋函式。std::min_element 是這些函式之一,用於檢索給定範圍內的最小元素。當未明確指定比較函式時,元素將與 operator< 進行比較。所以如果容器中存放了使用者自定義的物件,就必須定義相應的操作符。

該範圍應滿足 LegacyForwardIterator 的要求。std::min_element 函式接受兩個迭代器並將迭代器返回到範圍內的最小元素。如果範圍包括最小元素的多個例項,則演算法將迭代器返回到它們中的第一個。當給定範圍為空時,返回第二個引數迭代器。

以下示例顯示了 vector 容器的 std::min_element 的簡單用法。請注意,當我們想要最小元素的數字位置時,應該使用 std::distance 函式來計算它。

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  vector<string> v1 = {"ztop", "htop", "mtop", "ktop", "ptop"};
  vector<int> v2 = {111, 43, 12, 41, 34, 54, 13};

  auto ret = std::min_element(v1.begin(), v1.end());
  cout << "min_element(v1): " << std::setw(4) << *ret
       << "  at position: " << std::distance(v1.begin(), ret) << endl;

  auto ret2 = std::min_element(v2.begin(), v2.end());
  cout << "min_element(v2): " << std::setw(4) << *ret2
       << "  at position: " << std::distance(v2.begin(), ret2) << endl;

  return EXIT_SUCCESS;
}
min_element(v1): htop  at position: 1
min_element(v2):   12  at position: 2

使用 std::minmax_element 演算法查詢範圍內的最小元素和最大元素

STL 中包含的另一個強大的演算法是 std::minmax_element。它檢索給定範圍內的最小和最大元素。std::minmax_element 返回 std::pair 值,將最小元素儲存為第一個成員。請注意,當有多個值符合範圍內的最大值時,此演算法將返回最後一個元素。請注意,這兩種演算法也有過載,可以包含表示自定義比較函式的第三個引數。

#include <algorithm>
#include <iomanip>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

int main() {
  vector<string> v1 = {"ztop", "htop", "mtop", "ktop", "ptop"};
  vector<int> v2 = {111, 43, 12, 41, 34, 54, 13};

  auto ret3 = std::minmax_element(v1.begin(), v1.end());
  cout << "min (v1): " << std::setw(4) << *ret3.first
       << "| max (v1): " << std::setw(4) << *ret3.second << endl;

  auto ret4 = std::minmax_element(v2.begin(), v2.end());
  cout << "min (v2): " << std::setw(4) << *ret4.first
       << "| max (v2): " << std::setw(4) << *ret4.second << endl;

  return EXIT_SUCCESS;
}

輸出:

min (v1): htop| max (v1): ztop
min (v2):   12| max (v2):  111
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Algorithm