首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std::for_each相对于for循环的优势

std::for_each相对于for循环的优势
EN

Stack Overflow用户
提问于 2010-01-12 15:37:05
回答 11查看 125.5K关注 0票数 185

for循环相比,std::for_each有什么优势吗?对我来说,std::for_each似乎只是阻碍了代码的可读性。那么为什么一些编码标准推荐使用它呢?

EN

回答 11

Stack Overflow用户

发布于 2010-01-12 15:42:43

for_each更通用。您可以使用它来迭代任何类型的容器(通过传入begin/end迭代器)。您可以在使用for_each的函数下潜在地交换容器,而不必更新迭代代码。您需要考虑到除了std::vector和普通的老式C数组之外,世界上还有其他容器,才能看到for_each的优势。

for_each的主要缺点是它需要一个函数器,因此语法很笨拙。通过引入lambda,这在C++11 (以前的C++0x)中得到了解决:

std::vector<int> container;
...
std::for_each(container.begin(), container.end(), [](int& i){
    i+= 10;
});

3年后你就不会觉得奇怪了。

票数 25
EN

Stack Overflow用户

发布于 2010-01-12 16:20:13

就我个人而言,每当我需要使用std::for_each (编写特殊用途的函数器/复杂的boost::lambda)时,我发现BOOST_FOREACH和C++0x的范围更清晰:

BOOST_FOREACH(Monster* m, monsters) {
     if (m->has_plan()) 
         m->act();
}

vs

std::for_each(monsters.begin(), monsters.end(), 
  if_then(bind(&Monster::has_plan, _1), 
    bind(&Monster::act, _1)));
票数 18
EN

Stack Overflow用户

发布于 2016-08-09 23:24:45

简单:当您已经有一个处理每个数组项的函数时,for_each很有用,这样您就不必编写lambda了。当然,这是

for_each(a.begin(), a.end(), a_item_handler);

for(auto& item: a) {
    a_item_handler(a);
}

而且,for_each更加灵活,ranged for循环只会从头到尾遍历整个容器。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2047414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档