信奥竞赛

系列

剑指信奥 | C++ 之 STL - 算法 min & max

剑指信奥|C++ 之 STL 算法 min & max

max

今天我们继续学习 STL 算法,学习的内容是最大最小值相关的内容,这部分包含 6 个函数:

  1. max()
  2. max_element()
  3. min()
  4. min_element()
  5. minmax()
  6. minmax_element()

首先,我们看一下函数 max(),这个函数的作用是返回给定值中的最大值。

基本的 max() 函数接收两个参数:

  1. 参与比较的值 a
  2. 参与比较的值 b

代码示例:

#include<iostream>
#include<algorithm>

using namespace std;

int main() {

    // 初始化 a, b
    int a = 0;
    int b = 1;

    // 输出最大值
    cout << max(a, b) << endl;

    return 0;
}

/*
 output
    1
 */

代码讲解:

max() 的基本用法很简单,输出了两个数的最大值。

max() 也可以使用比较函数:

#include<iostream>
#include<algorithm>

using namespace std;

// 定义比较函数
inline int comp(string a, string b) {
    return a.length() < b.length();
}

int main() {

    // 初始化 a, b
    string a = "apple";
    string b = "orange";

    // 输出最大值
    cout << max(a, b, comp) << endl;

    return 0;
}

/*
 output
    orange
 */

max() 还可以使用一个初始化容器,比较这个容器中的元素,求得最大值:

#include<iostream>
#include<algorithm>

using namespace std;

// 定义比较函数
inline bool comp(string a, string b) {
    return a.length() < b.length();
}

int main() {

    // 输出最大值
    cout << max({"apple""orange"}, comp) << endl;

    return 0;
}

/*
 output
    orange
 */

这段代码中的容器已经初始化,返回时其中两个元素的最大值。

max_element

函数 max_element() 的作用就是返回一个容器在给定范围中的最大元素,也可以使用比较器。

基本的 max_element() 函数接收两个参数:

  1. 前向迭代器 first
  2. 前向迭代器 last

代码示例:

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

using namespace std;

int main() {

    vector<int> vi = {-2-10};

    vector<int>::iterator first, last, result;

    first = vi.begin();
    last = vi.end();

    // 输出最大元素
    result = max_element(first, last);
    cout << "max element index: " << result - first << endl;

    return 0;
}

/*
 output
    max element index: 2
 */

max_element() 函数返回值时指向最大元素的迭代器。

再来看一下使用了比较函数的例子:

#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>

using namespace std;

// 定义比较函数
inline bool comp(int a, int b) {
    return abs(a) < abs(b);
}

int main() {

    vector<int> vi = {-2-10};

    vector<int>::iterator first, last, result;

    first = vi.begin();
    last = vi.end();

    // 输出最大元素
    result = max_element(first, last, comp);
    cout << "max element index: " << result - first << endl;

    return 0;
}

/*
 output
    max element index: 0
 */

在这段函数中,我们使用了比较函数,比较的是两个数的绝对值,所以 -2 的绝对值最大,输出了这个元素的索引 0。

min & min_element

函数 min() 的作用分别是求两个变量的最小值,或一个初始化容器中的最小元素。

函数 min_element() 的作用是返回一个容器在指定范围内的最小元素的迭代器。

这两个函数的使用与 max 的使用完全类似,只不过是由最大值变成了最小值。在此不再举例。

minmax

函数 minmax() 的作用是输出两个值的最大与最小值,或是一个初始化容器的最大最小元素。

基本的 minmax() 接收 2 个参数:

  1. 参与比较的值 a
  2. 参与比较的值 b

代码示例:

#include<iostream>
#include<algorithm>

using namespace std;

int main() {

    // 初始化 a, b
    int a = 0;
    int b = 1;

    // 调用 minmax
    auto p = minmax(a, b);

    // 输出最小与最大值
    cout << "min = " << p.first << endl;
    cout << "max = " << p.second << endl;

    return 0;
}

/*
 output
    min = 0
    max = 1
 */

这个函数的返回结果是一个包含最小值与最大值的 pair,可以使用 firstsecond 输出最小与最大值。

minmax() 还可以接受一个初始化容器,求得容器中的最小与最大元素。

代码示例:

#include<iostream>
#include<algorithm>

using namespace std;

int main() {

    // 调用 minmax
    auto p = minmax({123});

    // 输出最小与最大元素
    cout << "min = " << p.first << endl;
    cout << "max = " << p.second << endl;

    return 0;
}

/*
 output
    min = 1
    max = 3
 */

此时,返回的结果仍然是包含了最小与最大元素的 pair

minmax() 也可以使用重载的添加比较函数的用法。

minmax_element

函数 minmax_element() 的作用就是返回一个容器给定范围内的最小与最大元素。

基本的 minmax_element() 函数接收 2 个参数:

  1. 前向迭代器 first
  2. 前向迭代器 last

代码示例:

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

using namespace std;

int main() {

    // 初始化 vector
    vector<int> vi = {123};

    // 声明迭代器
    vector<int>::iterator first, last;

    // 初识化迭代器
    first = vi.begin();
    last = vi.end();

    // 调用 minmax_element
    auto p = minmax_element(first, last);

    // 输出最大与最小元素
    cout << "min = " << *p.first << endl;
    cout << "max = " << *p.second << endl;

    return 0;
}

/*
 output
    min = 1
    max = 3
 */

需要注意的是,minmax_element() 返回的是指向最小与最大元素的迭代器构成的 pair,所以在输出元素时,要使用 *p.first*p.last 的方式。

minmax_element() 也具有使用比较函数的重载形式。

以上就是 C++ STL 中最大 / 最小算法的所有函数。