19

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

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

如果可能,没有显式for循环。

编辑:

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

4

6 回答 6

32

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

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

关于阅读输入的编辑:

相反,您可以从范围复制std::istream_iteratorvectorusing std::back_inserter

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

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

于 2010-11-11T09:51:16.880 回答
10

另一种选择——Boost.Lambda

for_each(v.begin(), v.end(), cout << boost::lambda::_1);
于 2010-11-11T10:00:23.187 回答
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));
}
于 2010-11-11T09:56:48.687 回答
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 到 vector 读取“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 表达式是什么?

于 2017-05-02T14:58:15.470 回答
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,但创建模板类来创建新类型并不难),那就更好了包装任意类型)。否则,如果其他人在您的翻译单元的其他地方做同样的事情,流式传输可能会变得模棱两可。

于 2010-11-11T10:40:12.777 回答
0

我知道copywith 迭代器是最佳解决方案,但只是回答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;
}
于 2021-09-22T21:35:20.747 回答