C++ 中的 STL 算法

Jinku Hu 2023年10月12日
  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 <algorithm>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
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 <algorithm>
#include <iostream>
#include <list>
#include <string>
#include <vector>

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

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 <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <vector>

using std::cin;
using std::cout;
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 <algorithm>
#include <iostream>
#include <list>
#include <numeric>
#include <string>
#include <vector>

using std::cin;
using std::cout;
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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ Algorithm