for_each用于执行副作用操作,如打印或修改元素;transform则用于数据转换,将输入序列映射为新序列,支持一元和二元操作,二者均提升代码清晰度与可维护性。

STL中的
for_each
transform
for_each
transform
在使用STL算法时,我发现很多人,包括我自己,刚开始都会习惯性地写
for
for_each
transform
for_each
for_each(InputIt first, InputIt last, UnaryFunction f)
[first, last)
f
f
我个人最喜欢用
for_each
#include <iostream>
#include <vector>
#include <algorithm> // for_each, transform
#include <numeric> // iota
int main() {
std::vector<int> numbers(5);
std::iota(numbers.begin(), numbers.end(), 1); // numbers: {1, 2, 3, 4, 5}
// 使用 for_each 打印每个元素
std::cout << "打印元素 (for_each): ";
std::for_each(numbers.begin(), numbers.end(), [](int n) {
std::cout << n << " ";
});
std::cout << std::endl;
// 使用 for_each 修改元素:将每个元素乘以2 (原地修改,需要非const引用)
std::cout << "修改元素 (for_each): ";
std::for_each(numbers.begin(), numbers.end(), [](int& n) {
n *= 2;
});
std::for_each(numbers.begin(), numbers.end(), [](int n) {
std::cout << n << " ";
});
std::cout << std::endl; // numbers: {2, 4, 6, 8, 10}
// ...
return 0;
}transform
transform
transform(InputIt first, InputIt last, OutputIt d_first, UnaryOperation unary_op)
transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op)
transform
#include <iostream>
#include <vector>
#include <algorithm> // for_each, transform
#include <numeric> // iota
#include <string>
int main() {
// ... (接上面的代码)
std::vector<int> original_numbers = {1, 2, 3, 4, 5};
// 使用 transform 将每个元素平方,存入新vector
std::vector<int> squared_numbers(original_numbers.size());
std::transform(original_numbers.begin(), original_numbers.end(), squared_numbers.begin(), [](int n) {
return n * n;
});
std::cout << "平方后的元素 (transform): ";
std::for_each(squared_numbers.begin(), squared_numbers.end(), [](int n) {
std::cout << n << " ";
});
std::cout << std::endl; // squared_numbers: {1, 4, 9, 16, 25}
// 使用 transform 将int转换为string
std::vector<std::string> string_numbers(original_numbers.size());
std::transform(original_numbers.begin(), original_numbers.end(), string_numbers.begin(), [](int n) {
return "Num_" + std::to_string(n);
});
std::cout << "转换为字符串 (transform): ";
std::for_each(string_numbers.begin(), string_numbers.end(), [](const std::string& s) {
std::cout << s << " ";
});
std::cout << std::endl; // string_numbers: {"Num_1", "Num_2", ...}
// transform 的双输入版本:将两个vector对应元素相加
std::vector<int> vec1 = {10, 20, 30};
std::vector<int> vec2 = {1, 2, 3};
std::vector<int> sum_vec(vec1.size());
std::transform(vec1.begin(), vec1.end(), vec2.begin(), sum_vec.begin(), [](int a, int b) {
return a + b;
});
std::cout << "两个vector相加 (transform): ";
std::for_each(sum_vec.begin(), sum_vec.end(), [](int n) {
std::cout << n << " ";
});
std::cout << std::endl; // sum_vec: {11, 22, 33}
return 0;
}我经常听到有人说:“不就是个循环嘛,写个
for
for
for
for_each
对我来说,选择
for_each
首先,意图表达更清晰。当你看到
std::for_each(vec.begin(), vec.end(), [](auto& item){ /* ... */ });其次,减少样板代码。每次写
for
for (auto it = container.begin(); it != container.end(); ++it)
for (size_t i = 0; i < container.size(); ++i)
for
for_each
再者,从某种角度看,使用算法库可以为未来的优化留下空间。虽然
for_each
std::execution::par
for_each
当然,我不是说要完全抛弃
for
for
如果说
for_each
transform
在很多实际项目中,我们经常会遇到这样的场景:从数据库读取了一批原始数据,需要将其格式化、计算或者转换成另一种结构才能用于显示或进一步处理。或者,你可能需要对图像的每个像素进行颜色变换,对音频的每个采样点进行增益调整,或者对金融数据进行批量计算。这些都是
transform
它的核心价值在于:
transform
std::vector<Person>
std::vector<std::string>
transform
int
double
transform
transform
transform
我个人在使用
transform
std::remove_if
std::transform
std::for_each
虽然
for_each
transform
首先,搞混for_each
transform
for_each
transform
for_each
return
for_each
transform
其次,迭代器失效问题。虽然
for_each
transform
push_back
erase
transform
再者,性能考量。对于非常小的集合,或者操作极其简单(比如仅仅是累加),手动写一个范围
for
for_each
transform
另外,Lambda的捕获机制。在使用Lambda表达式时,捕获变量的方式(值捕获
[var]
[&var]
[=]
[&]
for_each
std::vector<int> nums = {1, 2, 3, 4, 5, 6};
int even_count = 0;
// 错误:even_count 是值捕获,Lambda内部修改的是副本
// std::for_each(nums.begin(), nums.end(), [even_count](int n) {
// if (n % 2 == 0) even_count++;
// });
// 正确:even_count 是引用捕获,修改的是外部变量
std::for_each(nums.begin(), nums.end(), [&even_count](int n) {
if (n % 2 == 0) even_count++;
});
std::cout << "偶数数量: " << even_count << std::endl; // 输出 3这是一个很常见的错误,也是我当年刚接触Lambda时经常犯的。
最后,过度使用或过度复杂化。STL算法固然好,但并非银弹。如果一个操作逻辑非常复杂,需要多步处理,或者涉及复杂的条件判断和状态管理,强行用
for_each
transform
for
以上就是STL算法怎么使用 for_each和transform示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号