请注意,本文尚未完成!您可以通过编辑此文档页面来提供帮助。
使用算法
在 C++ 标准库中,我们发现了很多现成的算法,可以用来操作向量。
我们建议您使用 C++ 20 版本,因为解决方案更简单。对于由于某些原因无法安装支持最新标准的编译器的人,我们还将提供适用于旧版本的示例。
为了能够使用算法,我们需要在代码中添加以下头文件
#include <algorithm>
动机
- 搜索最小值 ( std::ranges::min())
- 搜索最大值 ( std::ranges::max())
- 计算给定元素出现的次数 ( std::ranges::count())
- 反转顺序 ( std::ranges::reverse())
- 排序向量元素 ( std::ranges::sort())
算法
首先,让我们创建一个简单的程序,在此程序上测试算法的操作。让我们准备一个数字数组
std::vector<int> numbers = { 22, 13, 27, 4 };
在任何情况下,使用算法都将归结为输入
- C++20
- 直到 C++20
std::ranges::<algorithm_name>( <vector_name> );
// for example:
std::ranges::sort(numbers);
std::<algorithm_name>(<vector_name>.begin(), <vector_name>.end());
// for example:
std::sort(numbers.begin(), numbers.end());
其中,我们用上面准备好的 numbers
替换 <vector_name>
。我们将在每次操作后使用我们之前学过的 for
循环显示其内容
for (int n : numbers)
std::cout << n << ' ';
演示
首先,让我们看看一个使用所有这些算法的示例代码,然后我们再讨论它们。
- C++20
- 直到 C++20
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = { 22, 13, 27, 4 };
int min = std::ranges::min(numbers);
int max = std::ranges::max(numbers);
std::cout << "The smallest: " << min << '\n';
std::cout << "The greatest: " << max << '\n';
// For the sake of demonstration of the "count"
// function I add a single 13 number to the end:
numbers.push_back(13);
size_t count = std::ranges::count(numbers, 13);
std::cout << "Occurrences of 13: " << count << '\n';
std::cout << "Before reversing:\n";
for (int n : numbers)
std::cout << n << ' ';
std::ranges::reverse(numbers);
std::cout << "\nAfter reversing:\n";
for (int n : numbers)
std::cout << n << ' ';
std::cout << "\nBefore sorting:\n";
for (int n : numbers)
std::cout << n << ' ';
std::ranges::sort(numbers);
std::cout << "\nAfter sorting:\n";
for (int n : numbers)
std::cout << n << ' ';
}
The smallest: 4
The greatest: 27
Occurrences of 13: 2
Before reversing:
22 13 27 4 13
After reversing:
13 4 27 13 22
Before sorting:
13 4 27 13 22
After sorting:
4 13 13 22 27
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = { 22, 13, 27, 4 };
int min = *std::min_element(numbers.begin(), numbers.end()); // 🟡
int max = *std::max_element(numbers.begin(), numbers.end()); // 🟡
std::cout << "The smallest: " << min << '\n';
std::cout << "The greatest: " << max << '\n';
// For the sake of demonstration of the "count"
// function I add a single 13 number to the end:
numbers.push_back(13);
size_t count = std::count(numbers.begin(), numbers.end(), 13);
std::cout << "Occurrences of 13: " << count << '\n';
std::cout << "Before reversing:\n";
for (int n : numbers)
std::cout << n << ' ';
std::reverse(numbers.begin(), numbers.end());
std::cout << "\nAfter reversing:\n";
for (int n : numbers)
std::cout << n << ' ';
std::cout << "\nBefore sorting:\n";
for (int n : numbers)
std::cout << n << ' ';
std::sort(numbers.begin(), numbers.end());
std::cout << "\nAfter sorting:\n";
for (int n : numbers)
std::cout << n << ' ';
}
The smallest: 4
The greatest: 27
Occurrences of 13: 2
Before reversing:
22 13 27 4 13
After reversing:
13 4 27 13 22
Before sorting:
13 4 27 13 22
After sorting:
4 13 13 22 27
标有 🟡 的代码更复杂,不幸的是,在 C++20 之前的版本中没有其他更简单的可能性。如果您正在使用旧版本的 C++,请考虑安装支持最新语言标准的编译器。
解释
最小值

要查找向量中的最小值,我们使用std::ranges::min
- C++20
- 直到 C++20
std::cout << std::ranges::min(numbers);
std::cout << std::min(numbers.begin(), numbers.end());
最大值

要查找向量中的最大值,我们这样使用std::ranges::max
- C++20
- 直到 C++20
std::cout << std::ranges::max(numbers);
std::cout << std::max(numbers.begin(), numbers.end());
计数出现次数
为了这个算法的目的,我们将在数组的末尾添加一个值 13
。

count
用于计算元素的出现次数,在这种情况下,是在向量内部。我们这样使用它
我们也可以将此结果写入变量。我们应该为此使用特殊类型 size_t
,它只是一个非负数(因为出现次数不能是负数)
- C++20
- 直到 C++20
size_t count = std::ranges::count(numbers, 13);
std::cout << "Occurrences of 13: " << count;
size_t count = std::count(numbers.begin(), numbers.end(), 13);
std::cout << "Occurrences of 13: " << count;
反转顺序

要反转向量元素的顺序,我们使用std::ranges::reverse
(在 C++20 之前使用std::reverse
)。
- C++20
- 直到 C++20
std::ranges::reverse(numbers);
std::reverse(numbers.begin(), numbers.end());
排序

我们这样使用sort
函数
- C++20
- 直到 C++20
std::ranges::sort(numbers);
std::sort(numbers.begin(), numbers.end());