如何使用for_each函数将内容输出到cout?

20

有没有更直接的方法来做这件事?

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

如果可能的话,不使用显式的for循环。

编辑:

如果可能,如何在具有std::vectorstd::cin中执行此操作?(仅读取n个元素)?


我在我的答案中添加了针对您的编辑的解决方案。 - Björn Pollex
@Space_C0wb0y:修改了我的修改,请检查。 - nakiya
为您的第二次编辑添加了链接。 - Björn Pollex
6个回答

36

你可以使用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>(std::cout));

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

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

假设你的容器是一个vector<int>,因此你需要将那部分替换为相应的类型。

编辑关于读取输入:

相反地,你可以使用std::back_inserter将一系列std::istream_iterator中的内容复制到vector中:

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

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


1
差不多了。ostream_iterator是一个模板,你需要std::ostream_iterator<v_Numbers::value_type>(cout) - GManNickG
2
没问题;我已经格式化了答案,所以没有滚动条,我觉得这样更容易阅读。如果你不同意,可以回滚。 - GManNickG
很遗憾,它似乎无法工作: 错误:v_Numbers不能出现在常量表达式中 - nakiya
@nakiya:错误只是信息的一半;那么代码呢?(编辑:嗯,你需要将其复制到输出,而不是使用“for_each”。错过了那个,抱歉Space。) - GManNickG
@nakiya:确实,您需要将模板参数中的v_Numbers替换为v_Numbers的类型(例如std::vector<int>::value_type)。 - Björn Pollex
我认为你的意思是使用 std::copyfor_each 需要一个接受 v_Numbers::value_typeoperator() - MSalters

10

另一个选项是Boost.Lambda

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

8

是的,但您必须使用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));
}

6

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

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

或者使用Lambda表达式

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

想了解更多有关Lambda表达式,可以访问什么是C++11中的Lambda表达式?


你的意思是 std::endl - Marine Galantin

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),并且只重载特定实例化的 vector(这需要 My_Type 不仅是 typedef,也不难创建一个模板类来创建包装任意类型的新类型),那么它会好得多。否则,如果其他人在您的翻译单元中的其他地方做同样的事情,流处理可能会变得模糊。


0

我知道使用迭代器的 copy 是最优解,但只是为了回答而使用 for_each

你可以这样做:

#include <vector>
#include <algorithm>
#include <locale>

int main() {
  using namespace std;
  locale::global(locale(""));
  wcout::imbue(locale());

  vector<int> vec{1000,2000,3000,4000,5000};
  for_each(vec.begin(), vec.end(), [](auto &x){wcout << x << endl;});
  
  return 0;
}

但是对我来说,使用简单的for循环更易读...

#include <vector>
#include <locale>

int main() {
  using namespace std;
  locale::global(locale(""));
  wcout::imbue(locale());

  vector<int> vec{1000,2000,3000,4000,5000};
  for(auto &v: vec) {
    wcout << v << endl;
  }
  
  return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接