Advantages of std::for_each over for loop

后端 未结 21 632
遥遥无期
遥遥无期 2020-11-29 15:23

Are there any advantages of std::for_each over for loop? To me, std::for_each only seems to hinder the readability of code. Why do then some coding

相关标签:
21条回答
  • 2020-11-29 16:06

    You can have the iterator be a call to a function that is performed on each iteration through the loop.

    See here: http://www.cplusplus.com/reference/algorithm/for_each/

    0 讨论(0)
  • 2020-11-29 16:07

    The nice thing with C++11 (previously called C++0x), is that this tiresome debate will be settled.

    I mean, no one in their right mind, who wants to iterate over a whole collection, will still use this

    for(auto it = collection.begin(); it != collection.end() ; ++it)
    {
       foo(*it);
    }
    

    Or this

    for_each(collection.begin(), collection.end(), [](Element& e)
    {
       foo(e);
    });
    

    when the range-based for loop syntax is available:

    for(Element& e : collection)
    {
       foo(e);
    }
    

    This kind of syntax has been available in Java and C# for some time now, and actually there are way more foreach loops than classical for loops in every recent Java or C# code I saw.

    0 讨论(0)
  • 2020-11-29 16:07

    The advantage of writing functional for beeing more readable, might not show up when for(...) and for_each(...).

    If you utilize all algorithms in functional.h, instead of using for-loops, the code gets a lot more readable;

    iterator longest_tree = std::max_element(forest.begin(), forest.end(), ...);
    iterator first_leaf_tree = std::find_if(forest.begin(), forest.end(), ...);
    std::transform(forest.begin(), forest.end(), firewood.begin(), ...);
    std::for_each(forest.begin(), forest.end(), make_plywood);
    

    is much more readable than;

    Forest::iterator longest_tree = it.begin();
    for (Forest::const_iterator it = forest.begin(); it != forest.end(); ++it{
       if (*it > *longest_tree) {
         longest_tree = it;
       }
    }
    
    Forest::iterator leaf_tree = it.begin();
    for (Forest::const_iterator it = forest.begin(); it != forest.end(); ++it{
       if (it->type() == LEAF_TREE) {
         leaf_tree  = it;
         break;
       }
    }
    
    for (Forest::const_iterator it = forest.begin(), jt = firewood.begin(); 
         it != forest.end(); 
         it++, jt++) {
              *jt = boost::transformtowood(*it);
        }
    
    for (Forest::const_iterator it = forest.begin(); it != forest.end(); ++it{
        std::makeplywood(*it);
    }
    

    And that is what I think is so nice, generalize the for-loops to one line functions =)

    0 讨论(0)
提交回复
热议问题