How do I use for_each to output to cout?

后端 未结 5 1461
没有蜡笔的小新
没有蜡笔的小新 2020-12-23 14:58

Is there a more straight-forward way to do this?

for_each(v_Numbers.begin(), v_Numbers.end(), bind1st(operator<<, cout));

Without an expli

相关标签:
5条回答
  • 2020-12-23 15:42

    yup, using lambda expression (C++ 11) we can inline printing of each element of a STL container to cout.

    #include <iostream>   // cout
    #include <vector>     // vector
    #include <algorithm>  // for_each
    #include <iterator>   // istream_iterator
    using namespace std;
    
    int main()
    {
       std::vector<int> v(10,2);
       std::for_each(v.begin(), v.end(), [](int i)->void {std::cout << i <<endl;});
       return 0;
    }
    

    For reading "n" values from cin to vector,

     int main()
     {
       std::vector<int> v;
    
       int elementsToRead;
       cin>>elementsToRead;  // Number of elements to copy
    
       // Reading from istream
       std::istream_iterator<int> ii2(std::cin);
       std::copy_n(ii2, elementsToRead, std::back_inserter(v));
    
       // printing updated vector
       std::for_each(v.begin(), v.end(), [](int i)->void {cout << i <<endl;});
    
       return 0;
    }
    

    (or) by using Lambda expression

    std::for_each(std::istream_iterator<int>(cin),std::istream_iterator<int>(),[&v](int i)->void { v.push_back(i);});
    

    To know more about Lambda expression @ What is a lambda expression in C++11?

    0 讨论(0)
  • 2020-12-23 15:44

    Yep, but you must use std::copy algorithm:

    #include <iostream>
    #include <iterator>
    #include <vector>
    
    int main()
    {
        std::vector<int> a;
        // fill a...
        std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout));
    }
    
    0 讨论(0)
  • 2020-12-23 15:54

    You could achieve this using std::copy into a std::ostream_iterator:

    std::vector<int> v_Numbers; // suppose this is the type
    // put numbers in
    std::copy(v_Numbers.begin(), v_Numbers.end(),
              std::ostream_iterator<int>(cout));
    

    It would be even nicer if you add some suffix:

    std::copy(v_Numbers.begin(), v_Numbers.end(),
              std::ostream_iterator<int>(cout, "\n"));
    

    This assumes that your container is a vector<int>, so you will have to replace that part with the appropriate type.

    Edit regarding reading input:

    Conversely, you can copy from a range of std::istream_iterator into a vector using std::back_inserter:

    std::vector<int> v_Numbers;
    std::copy(std::istream_iterator<int>(cin), std::istream_iterator<int>(),
              std::back_inserter(v_Numbers));
    

    If you want to read n elements only, look at this question.

    0 讨论(0)
  • 2020-12-23 15:55

    Another option — Boost.Lambda.

    for_each(v.begin(), v.end(), cout << boost::lambda::_1);
    
    0 讨论(0)
  • 2020-12-23 16:03

    Not always appropriate in corporate code, but for the sake of enumerating options - if you really find other for_each / std::copy etc. solutions too verbose, you could write:

    std::ostream& operator(std::ostream& os, const std::vector<My_Type>& v)
    {
         // pick one of the other implementations for here...
        std::copy(std::istream_iterator<My_Type>(os), std::istream_iterator<My_Type>(),   
              std::back_inserter(v_Numbers));   
    }
    

    It's much nicer if you're well-mannered (;-p) enough to only overload your specific instantiation of vector (which requires My_Type be more than a typedef to say int, though it's not hard to create a templated class to create new types wrapping an arbitrary type). Otherwise, if someone else does the same elsewhere in your translation unit, the streaming could become ambiguous.

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