来自 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