C++ 中的 STL 算法
-
使用
std::sort
算法在 C++ 中对通用向量范围进行排序 -
使用
std::reverse
算法反转 C++ 中的元素顺序 -
在 C++ 中使用
std::accumulate
算法计算范围内元素的总和 -
使用
std::count
算法计算 C++ 中满足特定条件的元素数量
本文将介绍 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
可用于反转序列容器的内容,例如 vector
、list
或 deque
。该函数接受两个迭代器参数并且可以对任何泛型类型进行操作。以下代码示例显示了两个场景,其中整数 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
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