C++ 中的 STL 算法

Jinku Hu 2023年1月30日 2021年10月2日
  1. 使用 std::sort 算法在 C++ 中对通用向量范围进行排序
  2. 使用 std::reverse 算法反转 C++ 中的元素顺序
  3. 在 C++ 中使用 std::accumulate 算法计算范围内元素的总和
  4. 使用 std::count 算法计算 C++ 中满足特定条件的元素数量
C++ 中的 STL 算法

本文将介绍 C++ 中 STL 算法库中的几个函数。

使用 std::sort 算法在 C++ 中对通用向量范围进行排序

std::sort 是 STL 中最常用的算法之一。它有多个重载,其中最简单的一个接受两个满足 LegacyRandomAccessIterator 要求的迭代器,并按非降序对元素进行排序。之所以说后者,是因为不能保证相等元素的顺序。

std::sort 通常用于 vector 范围。以下代码片段演示了这种用法。该算法可以选择采用比较函数,该函数将用于评估元素对并相应地对范围进行排序。

以下示例显示了 STL 函数对象 - std::greater 作为比较函数传递的一行。或者,可以定义自定义函数对象或直接将 lambda 表达式指定为 std::sort 的第三个参数。

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

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

template<typename T>
void printRange(std::vector<T> v) {
    for (const auto &item : v) {
        cout << item << ", ";
    }
    cout << endl;
}

int main() {
    std::vector<int> v1 = { 1, 3, 5, 11,
                            9, 10, 13, 20 };


    std::sort(v1.begin(), v1.end());
    printRange(v1);

    std::sort(v1.begin(), v1.end(), std::greater<>());
    printRange(v1);

    std::sort(v1.begin(), v1.end(), [](int a, int b) { return (a-2) != b;});
    printRange(v1);

    return EXIT_SUCCESS;
}

输出:

1, 3, 5, 9, 10, 11, 13, 20,
20, 13, 11, 10, 9, 5, 3, 1,
1, 3, 5, 9, 10, 11, 13, 20

使用 std::reverse 算法反转 C++ 中的元素顺序

std::reverse 可用于反转序列容器的内容,例如 vectorlistdeque。该函数接受两个迭代器参数并且可以对任何泛型类型进行操作。以下代码示例显示了两个场景,其中整数 vector 和字符串 list 颠倒。在调用 std::reverse 算法之前,我们还使用 sort 成员函数对 list 对象进行排序。请注意,std::sort 算法不适用于 std::list 容器。

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <list>

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

template<typename T>
void printRange(std::vector<T> v) {
    for (const auto &item : v) {
        cout << item << ", ";
    }
    cout << endl;
}

template<typename T>
void printRange(std::list<T> v) {
    for (const auto &item : v) {
        cout << item << ", ";
    }
    cout << endl;
}

int main() {
    std::vector<int> v1 = { 1, 3, 5, 11,
                            9, 10, 13, 20 };
    std::list<string> l1 = {  "htop",
                              "wtop",
                              "rtop",
                              "ktop",
                              "ktop",
                              "ptop"};


    std::reverse(v1.begin(), v1.end());
    printRange(v1);

    l1.sort();
    std::reverse(l1.begin(), l1.end());
    printRange(l1);

    return EXIT_SUCCESS;
}

输出:

20, 13, 10, 9, 11, 5, 3, 1,
wtop, rtop, ptop, ktop, ktop, htop,

在 C++ 中使用 std::accumulate 算法计算范围内元素的总和

std::accumulate 是数值算法的一部分,可用于对给定范围的每个元素进行常见的算术运算。在这种情况下,给定算法计算范围内每个元素的总和。std::accumulate 有两个重载,第一个重载表示范围本身的两个迭代器和表示求和的起始值的值 init。第二个重载可以选择将函数对象作为应用的第四个参数而不是求和。

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <numeric>

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

int main() {
    std::vector<int> v1 = { 1, 3, 5, 11,
                            9, 10, 13, 20 };

    auto sum = std::accumulate(v1.begin(), v1.end(), 0);
    cout << "Sum of 'v1' vector = " << sum << endl;

    sum = std::accumulate(v1.begin(), v1.end(), 1, std::multiplies());
    cout << "Accumulate of 'v1' vector = " << sum << endl;

    return EXIT_SUCCESS;
}

输出:

Sum of 'v1' vector = 72
Accumulate of 'v1' vector = 3861000

使用 std::count 算法计算 C++ 中满足特定条件的元素数量

std::count 函数是一种计算给定范围内特定元素的有用方法。也就是说,我们可以传递范围迭代器和 value 来匹配所有等于给定值的元素。另一个重载可以接受返回评估有效匹配的一元谓词,并且算法相应地检索计数。在下一个示例中,我们指定了一个 lambda 表达式来计算 vector 对象中的偶数。

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <list>
#include <numeric>

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

int main() {
    std::vector<int> v1 = { 1, 3, 5, 11,
                            9, 10, 13, 20 };

    auto count_10 = std::count(v1.begin(), v1.end(), 10);
    cout << count_10 << " occurrences of number 10" << endl;

    auto count_even = std::count_if(v1.begin(), v1.end(), [](int i){return i % 2 == 0;});
    cout << count_even << " even numbers in 'v1' vector" << endl;

    return EXIT_SUCCESS;
}

输出:

1 occurrences of number 10
2 even numbers in 'v1' vector
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相关文章 - C++ Algorithm