一、什么是applies
applies是一种C++ STL算法,它可以将特定函数应用于迭代器范围内的每个元素。这个函数可以是一个全局函数、一个成员函数、一个函数对象或一个Lambda表达式。 applies是用来遍历迭代器容器的一个高级循环,在STL算法中应用广泛。
二、applies的基本用法
#include <algorithm>
#include <iostream>
#include <vector>
void print(int i) {
std::cout << i << " ";
}
int main() {
std::vector<int> v{ 1, 2, 3, 4, 5 };
std::for_each(v.begin(), v.end(), print); // 使用applies输出vector中的元素
return 0;
}
输出结果为:1 2 3 4 5。applies函数对于迭代器容器的遍历十分方便,不需要再使用for循环进行迭代器的遍历了。
三、applies与Lambda表达式的结合
applies与Lambda表达式结合,可以用来实现更加复杂的遍历操作。
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> v{ 1, 2, 3, 4, 5 };
std::for_each(v.begin(), v.end(), [](int &x) {
x *= 2;
}); // 使用applies和Lambda表达式将vector中的每个元素乘以2
std::for_each(v.begin(), v.end(), [](int x) {
std::cout << x << " ";
}); // 输出vector中的元素
return 0;
}
输出结果为:2 4 6 8 10。使用Lambda表达式可以使applies循环更加灵活,实现不同的操作。
四、applies与函数对象的结合
applies还可以与函数对象结合使用,这时候可以充分利用函数对象的成员变量和成员函数,实现更加丰富的操作。
#include <algorithm>
#include <iostream>
#include <vector>
class Multiply {
public:
Multiply(int _n) : n(_n) {} // 构造函数
void operator()(int &x) { x *= n; } // 函数调用运算符
private:
int n;
};
int main() {
std::vector<int> v{ 1, 2, 3, 4, 5 };
Multiply mul(3); // 定义一个函数对象
std::for_each(v.begin(), v.end(), mul); // 使用applies和函数对象将vector中的每一个元素乘以3
std::for_each(v.begin(), v.end(), [](int x) {
std::cout << x << " ";
}); // 输出vector中的元素
return 0;
}
输出结果为:3 6 9 12 15。与Lambda表达式不同,函数对象可以定义成员变量和成员函数,具有更加灵活的操作空间。
五、applies的自定义函数
除了使用Lambda表达式和函数对象,我们也可以自定义一个函数来配合applies使用。
#include <algorithm>
#include <iostream>
#include <vector>
void multiply(int &x, int n) {
x *= n;
}
int main() {
std::vector<int> v{ 1, 2, 3, 4, 5 };
std::for_each(v.begin(), v.end(), std::bind(multiply, std::placeholders::_1, 4)); // 使用applies和自定义函数将vector中的每一个元素乘以4
std::for_each(v.begin(), v.end(), [](int x) {
std::cout << x << " ";
}); // 输出vector中的元素
return 0;
}
输出结果为:4 8 12 16 20。自定义函数可以更加灵活的应用于applies中,实现不同的操作需求。