Как использовать for_each для вывода в cout?

Есть ли более прямой способ сделать это?

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

Без явного цикла for, если это возможно.

EDIT:

Как это сделать для std::cin с std::vector, если это возможно? (Как читать только элементы n)?

Ответы

Ответ 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<int>, поэтому вам придется заменить эту часть соответствующим типом.

Изменить относительно ввода:

И наоборот, вы можете скопировать из диапазона std::istream_iterator в vector с помощью 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 элементов, посмотрите этот вопрос.

Ответ 2

Другой вариант - Boost.Lambda.

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

Ответ 3

Да, но вы должны использовать алгоритм 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));
}

Ответ 4

yup, используя лямбда-выражение (С++ 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;
}

Для чтения значений "n" от cin to 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);});

Чтобы узнать больше о выражении лямбда @Что такое лямбда-выражение в С++ 11?

Ответ 5

Не всегда подходит для корпоративного кода, но для перечисления опций - если вы действительно найдете другие решения 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, хотя создать шаблонный класс для создавать новые типы, обертывающие произвольный тип). В противном случае, если кто-то другой сделает то же самое в другом месте вашей единицы перевода, потоковая передача может стать двусмысленной.