如何使用for_each输出到cout?

时间:2010-11-11 09:50:07

标签: c++ algorithm stl cout

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

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

如果可能的话,没有明确的for循环。

编辑:

如果可能,std::cin std::vector怎么办? (如何仅阅读n个元素?)

5 个答案:

答案 0 :(得分:30)

您可以使用std::copystd::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));

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

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

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

关于阅读输入的

编辑

相反,您可以使用std::istream_iteratorstd::back_inserter范围内复制到vector

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

如果您只想阅读n个元素,请查看this question

答案 1 :(得分:9)

另一种选择 - Boost.Lambda

for_each(v.begin(), v.end(), cout << boost::lambda::_1);

答案 2 :(得分: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));
}

答案 3 :(得分:4)

是的,使用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;
}

阅读&#34; n&#34;从cin到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;
}

(或)使用Lambda表达式

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

了解有关Lambda表达式@ What is a lambda expression in C++11?

的更多信息

答案 4 :(得分:0)

并不总是适合公司代码,但为了枚举选项 - 如果你真的发现其他for_each / std :: copy等解决方案过于冗长,你可以写:

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));   
}

如果你很有礼貌(;-p)足以只重载你的特定矢量实例(这需要My_Type比一个typedef更多来说int,这要好得多,尽管创建一个模板化的类并不难创建包装任意类型的新类型)。否则,如果其他人在您的翻译单元的其他地方做同样的事情,那么流式传输可能会变得模棱两可。