C++ 常用算法示例
介绍
C++标准模板库(STL)提供了大量高效、通用的算法,帮助开发者处理各种常见的编程任务。这些算法被设计为与STL容器和迭代器协同工作,使得代码更加简洁、高效且可读性强。本文将介绍一些C++ STL中最常用的算法,配合示例代码帮助初学者理解和掌握这些算法的使用方法。
要使用STL算法,首先需要包含相应的头文件:
#include <algorithm> // 大多数算法
#include <numeric> // 数值算法,如accumulate
#include <functional> // 函数对象
常用算法分类
STL算法可以大致分为以下几类 :
- 非修改性序列操作:不改变序列中元素的值或位置
- 修改性序列操作:改变元素的值或位置
- 排序和相关操作:排序、合并、搜索等
- 数值操作:数学运算相关
让我们逐一探索这些类别中的常用算法。
非修改性序列操作
1. std::find
- 查找元素
find
算法搜索指定范围内的第一个与给定值相等的元素。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// 查找值为30的元素
auto it = std::find(vec.begin(), vec.end(), 30);
if (it != vec.end()) {
std::cout << "找到元素: " << *it << ",位置: " << (it - vec.begin()) << std::endl;
} else {
std::cout << "未找到元素" << std::endl;
}
return 0;
}
输出:
找到元素: 30,位置: 2
2. std::count
- 计数
count
算法计算指定范围内等于给定值的元素个数。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 2, 4, 2, 5};
// 计算值为2的元素个数
int count = std::count(vec.begin(), vec.end(), 2);
std::cout << "值为2的元素个数: " << count << std::endl;
return 0;
}
输出:
值为2的元素个数: 3
3. std::for_each
- 应用函数于每个元素
for_each
算法对范围内的每个元素应用指定的函数。
#include <algorithm>
#include <iostream>
#include <vector>
void printElement(int n) {
std::cout << n << " ";
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::cout << "容器中的元素: ";
std::for_each(vec.begin(), vec.end(), printElement);
std::cout << std::endl;
// 使用lambda表达式
std::cout << "每个元素的平方: ";
std::for_each(vec.begin(), vec.end(), [](int n) {
std::cout << n * n << " ";
});
std::cout << std::endl;
return 0;
}
输出:
容器中的元素: 1 2 3 4 5
每个元素的平方: 1 4 9 16 25
修改性序列操作
1. std::transform
- 变换元素
transform
算法将一个操作应用于一个范围的每个元素,并将结果存储在另一个范围中。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec1 = {1, 2, 3, 4, 5};
std::vector<int> vec2(5); // 预分配空间
// 将vec1中的每个元素平方后存入vec2
std::transform(vec1.begin(), vec1.end(), vec2.begin(),
[](int x) { return x * x; });
std::cout << "原始数组: ";
for (int num : vec1) {
std::cout << num << " ";
}
std::cout << std::endl;
std::cout << "平方后: ";
for (int num : vec2) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
输出:
原始数组: 1 2 3 4 5
平方后: 1 4 9 16 25
2. std::copy
- 复制元素
copy
算法将一个范围内的元素复制到另一个范围。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> source = {1, 2, 3, 4, 5};
std::vector<int> destination(5); // 预分配空间
// 将source中的元素复制到destination
std::copy(source.begin(), source.end(), destination.begin());
std::cout << "目标数组: ";
for (int num : destination) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
输出:
目标数组: 1 2 3 4 5
3. std::replace
- 替换元素
replace
算法将范围内所有等于给定值的元素替换为新值。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 2, 5};
std::cout << "替换前: ";
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
// 将所有值为2的元素替换为20
std::replace(vec.begin(), vec.end(), 2, 20);
std::cout << "替换后: ";
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
输出:
替换前: 1 2 3 2 5
替换后: 1 20 3 20 5