Page 1 of 1

C++ STL中 for_each 算法存在的意义是什么?

Posted: 2023-03-06T01:23:29+00:00
by expl
C++ STL中 for_each 算法存在的意义是什么?

我问题描述里在for循环里用auto是为了和for_each里的begin与end相呼应,我知道有范围for循环这个概念,我也知道那个迭代器有个类型好复杂的,只是提问的时候想不起来了又懒得翻书就写了个auto。
我的提问点是for_each和普通for循环在写法结构相似——1都要写明循环起始终止条件,2循环体里的func单独抽出来定义和用lambda表达式写法也很相似,仅仅是少了一些变量类型的定义),那么单独开发一个for_each作为标准库的意义在哪里。
我的重点不是auto,不是auto,不是auto!请忽略那个auto!!!!
请大神们不要用range based for这个概念来砸我,好委屈哇呜呜。

(1)感谢得赞不高的几位,我已经给你们单独点赞,因为你们从正面直截了当地回答了我心中的疑惑,让我立刻放下纠结,得到释怀。
(2)写发苹果故事的那位阿邱同学,创意很不错,但是没有正面回答,而是讲故事的方式引导我,反而让我陷入了新一轮的疑惑,有空咱们继续讨论讨论,交个朋友。
(3)还有一些拿范围for循环概念砸我的,我不说话了,我问A和B相比怎么样,你告诉我用C更好,好委屈,也怪我没有描述好问题,让你们理解错了。
(4)一个小问题,能让各路大神替我解惑,深感荣幸。谢谢大家!

----------原问题如下--------------
最近学习《c++primer 5》,闲暇时思考人生,琢磨for_each这个算法的存在意义是什么?
<algorithm>头文件中,比如sort、unique、find_if等等,类似matlab一样封装了复杂的代码,使我们可以避免浪费时间在基础经典算法上,并且运行效率高,也使得代码简洁易懂。
当学到for_each的时候,我把以前作业里的代码套进for_each中,虽然都成功运行,却让我满头雾水:明明一个for循环就能表达,为什么要用for_each?它的好处在哪?
比如下面一段代码:(知乎编辑代码真难写,格式不对齐,还不知道写错没有)

vector<T> data = xxoo;
for_each(data.begin(), data.end(), [](vector<T>& d) { func(d); } );

而原本用for循环

for(auto it = data.begin(); it != data.end(); ++it)
{
func(*it);
}

------
从简洁的角度,虽然for_each代码只占一行,但是它的lambda表达式相当于把一坨代码挤到了一起,如果func函数代码很长,还是要分行写。
从可读性来说,一个for循环的可读性比for_each高的不知道哪里去。
那从效率方面呢?STL标准库里对for_each的解释貌似也是一个循环,只不过是while循环。
综上所述,for_each即不美观,也欠可读,效率也没提升,它的存在意义是什么?
有人能举个例子表明它的优越性么?
-----