如何使用for_each输出到cout?

nak*_*iya 17 c++ algorithm stl cout

有没有更直接的方式来做到这一点?

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

没有显式for循环,如果可能的话.

编辑:

如何做到这一点的std::cinstd::vector可能的话?(如何n仅读取元素)?

Bjö*_*lex 30

您可以使用std::copy以下内容实现此目的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));
Run Code Online (Sandbox Code Playgroud)

如果你添加一些后缀会更好:

std::copy(v_Numbers.begin(), v_Numbers.end(),
          std::ostream_iterator<int>(cout, "\n"));
Run Code Online (Sandbox Code Playgroud)

这假设您的容器是a vector<int>,因此您必须使用适当的类型替换该部分.

关于阅读输入的编辑:

相反,您可以从一系列复制std::istream_iteratorvector使用std::back_inserter:

std::vector<int> v_Numbers;
std::copy(std::istream_iterator<int>(cin), std::istream_iterator<int>(),
          std::back_inserter(v_Numbers));
Run Code Online (Sandbox Code Playgroud)

如果您只想阅读n个元素,请查看此问题.

  • 没问题; 我格式化了答案,所以没有滚动条,我觉得这样更容易阅读.如果你愿意,你可以不同意和回滚. (2认同)

Cat*_*lus 9

另一种选择 - Boost.Lambda.

for_each(v.begin(), v.end(), cout << boost::lambda::_1);
Run Code Online (Sandbox Code Playgroud)


Sim*_*one 7

是的,但你必须使用std :: copy算法:

#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));
}
Run Code Online (Sandbox Code Playgroud)


小智 5

是的,使用 lambda 表达式(C++ 11),我们可以将 STL 容器的每个元素内联打印到 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;
}
Run Code Online (Sandbox Code Playgroud)

为了从 cin 到向量读取“n”个值,

 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;
}
Run Code Online (Sandbox Code Playgroud)

(或) 通过使用 Lambda 表达式

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

要了解有关 Lambda 表达式的更多信息@什么是 C++11 中的 lambda 表达式?