全局算法
在C++中,全局算法通常指的是不依赖于特定数据结构或对象,而是可以在各种数据集合上使用的通用 算法。这些算法通常定义在标准模板库(STL)中,因此可以在整个程序中重复使用,适用于多种数据 类型。STL中的算法可以作用于数组、向量、列表、集合、映射等容器。使用这些算法时,通常需要包 含头文件 <algorithm>。
(1)遍历算法
std::for_each
std::for_each 算法用于对容器中的每个元素执行指定的函数或操作。它接受一个迭代器范围(开始和 结束迭代器)和一个函数对象(可以是函数指针、lambda表达式或函数对象类实例)。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void Double(int &n)
{
n *= 2;
}
int main()
{
std::vector<int> v{ 1, 2, 3, 4, 5 };
std::for_each(v.begin(), v.end(), Double);//函数指针
std::for_each(v.begin(), v.end(), [](int n) { std::cout << n << ' ';});//lambda表达式
std::cout << std::endl;
return 0;
}
std::copy
std::copy 算法用于将一个容器中的元素复制到另一个容器中。它同样接受一个迭代器范围和一个输出 迭代器,用于指定复制的目标位置
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
std::vector<int> source{ 1, 2, 3, 4, 5 };
std::vector<int> destination;
destination.resize(source.size());
std::copy(source.begin(), source.end(), destination.begin());
for (int n : destination)
{
std::cout << n << ' ';
}
std::cout << std::endl;
return 0;
}
std::transform
std::transform 算法用于对容器中的每个元素应用一个函数或操作,并将结果存储在另一个容器中。 它类似于 std::for_each ,但还允许你指定一个输出迭代器来存储转换后的结果。
#include <iostream>
#include <vector>
#include <algorithm>
int Double(int n)
{
return n * 2;
}
int main() {
std::vector<int> v{ 1, 2, 3, 4, 5 };
std::vector<int> result;
result.resize(v.size());
std::transform(v.begin(), v.end(), result.begin(), [](int n) { return n * 2;});
for (int n : result) {
std::cout << n << ' ';
}
std::cout << std::endl;
std::transform(result.begin(), result.end(), result.begin(), Double);
for (int n : result) {
std::cout << n << ' ';
}
std::cout << std::endl;
return 0;
}
std::replace 和 std::replace_if
std::replace 算法用于将容器中所有等于给定值的元素替换为另一个值。而 std::replace_if 则根据 指定的条件来替换元素。
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> v{ 1, 2, 3, 2, 5 };
std::replace(v.begin(), v.end(), 2, 10); // 将所有2替换为10
for (int n : v)
{
std::cout << n << ' ';
}
std::cout << std::endl;
std::replace_if(v.begin(), v.end(), [](int n) { return n % 2 == 0; }, 20);
// 将所有偶数替换为20
for (int n : v)
{
std::cout << n << ' ';
}
std::cout << std::endl;
return 0;
}