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