【问题标题】:How do I use for_each to output to cout?如何使用 for_each 输出到 cout?
【发布时间】:2011-05-08 09:01:09
【问题描述】:

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

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

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

编辑:

如果可能,如何使用std::vectorstd::cin 执行此操作? (如何仅读取n 元素)?

【问题讨论】:

  • 添加了您对我的回答进行编辑的解决方案。
  • @Space_C0wb0y:编辑了我的编辑。请检查。
  • 为您的第二次编辑添加了链接。

标签: c++ algorithm stl cout


【解决方案1】:

您可以将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));

加个后缀就更好了:

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

这假定您的容器是vector&lt;int&gt;,因此您必须将该部分替换为适当的类型。

编辑关于阅读输入:

相反,您可以使用std::back_inserterstd::istream_iterator 的范围复制到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

【讨论】:

  • 差不多。 ostream_iterator 是模板,你要std::ostream_iterator&lt;v_Numbers::value_type&gt;(cout)
  • 没问题;我格式化了答案,所以没有滚动条,我发现这样更容易阅读。如果你愿意,你可以不同意并回滚。
  • 可悲的是,它似乎不起作用:error: v_Numbers cannot appear in a constant-expression
  • @nakiya:错误只是信息的一半;代码是什么? (编辑:呃,你需要copy 来输出,而不是for_each。错过了,对不起空间。)
  • @nakiya:确实,您必须将模板参数中的v_Numbers 替换为v_Numbers 的类型(例如std::vector&lt;int&gt;::value_type)。
【解决方案2】:

是的,但你必须使用 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】:

    另一种选择——Boost.Lambda

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

    【讨论】:

      【解决方案4】:

      在公司代码中并不总是合适的,但为了列举选项 - 如果你真的发现其他 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,但创建一个模板化的类并不难),那就更好了创建包装任意类型的新类型)。否则,如果其他人在您的翻译单元的其他地方做同样的事情,流式传输可能会变得模棱两可。

      【讨论】:

        【解决方案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;
        }
        

        用于从 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 表达式@What is a lambda expression in C++11?

        【讨论】:

          【解决方案6】:

          我知道带有迭代器的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;
          }
          

          【讨论】:

            猜你喜欢
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            • 2011-07-08
            • 2023-02-25
            • 2015-07-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多