std::transform 是一个常用的 STL 算法,用于对序列中的每个元素进行操作,并将结果存储在另一个序列中。
lambda 表达式是一种匿名函数,可以在需要传递函数作为参数的场景中使用,比如在 std::transform 中。
语法:
// 一元操作
std::transform(InputIterator1 first1, InputIterator1 last1, OutputIterator result, UnaryOperation op);
// 二元操作
std::transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryOperation op);
first1, last1:表示输入序列的开始和结束迭代器。
first2: 表示第二个输入序列的开始迭代器(用于二元操作)。
result:表示输出序列的开始迭代器。
op:表示应用于输入序列的操作函数,可以是普通函数、仿函数或 lambda 表达式。
使用 std::transform 和 lambda 表达式的示例
一元操作:
点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> result(vec.size());
// 使用 std::transform 和 lambda 表达式将每个元素加倍
std::transform(vec.begin(), vec.end(), result.begin(), [](int x) {
return x * 2;
});
// 输出结果
for (int n : result) {
std::cout << n << " "; // 输出: 2 4 6 8 10
}
std::cout << std::endl;
return 0;
}
二元操作:
点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec1 = {1, 2, 3, 4, 5};
std::vector<int> vec2 = {10, 20, 30, 40, 50};
std::vector<int> result(vec1.size());
// 使用 std::transform 和 lambda 表达式将两个数组的元素相加
std::transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), [](int x, int y) {
return x + y;
});
// 输出结果
for (int n : result) {
std::cout << n << " "; // 输出: 11 22 33 44 55
}
std::cout << std::endl;
return 0;
}
lambda 表达式的结构
[capture](parameters) -> return_type { // function body }
capture:捕获列表,指定在 lambda 表达式中如何捕获外部变量。可以是按值捕获(=),按引用捕获(&),或者显式列出要捕获的变量。
parameters:参数列表,和普通函数的参数列表一样。
return_type(可选):返回类型,如果可以从函数体中推导出返回类型,可以省略。
函数体:lambda 表达式的具体操作。
示例:捕获外部变量
在某些情况下,lambda 可能需要使用外部变量。这时可以通过捕获列表来实现:
点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
int factor = 3;
// 使用 lambda 表达式捕获外部变量 factor
std::transform(vec.begin(), vec.end(), vec.begin(), [factor](int x) {
return x * factor;
});
// 输出结果
for (int n : vec) {
std::cout << n << " "; // 输出: 3 6 9 12 15
}
std::cout << std::endl;
return 0;
}