Ограничение диапазона для std :: copy с помощью std: : istream_iterator

Я создал минимальный рабочий пример, чтобы показать проблему, с которой я столкнулся при использовании итераторов STL. Я использую istream_iterator для чтения float s (или других типов) из std :: istream :

#include <iostream>
#include <iterator>
#include <algorithm>

int main() {
   float values[4];
   std::copy(std::istream_iterator<float>(std::cin), std::istream_iterator<float>(), values);
   std::cout << "Read exactly 4 floats" << std::endl; // Not true!
}

Это считывает все возможные float s, до EOF в значения , который имеет фиксированный размер, 4, поэтому теперь ясно, что я хочу ограничить диапазон, чтобы избежать переполнения и прочитать точно / максимум 4 значения.

С большим количеством "обычные" итераторы (например, RandomAccessIterator), при условии, что begin + 4 не вышли за пределы того конца, который вы бы сделали:

std::copy(begin, begin+4, out);

Чтобы прочитать ровно 4 элемента.

Как это сделать с помощью std :: istream_iterator ? Очевидная идея состоит в том, чтобы изменить вызов std :: copy на:

std::copy(std::istream_iterator<float>(std::cin), std::istream_iterator<float>(std::cin)+4, values);

Но (вполне предсказуемо) это не компилируется, нет кандидатов на оператор + :

g++ -Wall -Wextra test.cc
test.cc: In function ‘int main()’:
test.cc:7: error: no match for ‘operator+’ in ‘std::istream_iterator<float, char, std::char_traits<char>, long int>(((std::basic_istream<char, std::char_traits<char> >&)(& std::cin))) + 4’

Есть предложения? Есть ли правильный способ достижения этого "STLified" до C ++ 0x? Очевидно, я мог бы просто записать это как цикл for, но я хочу узнать кое-что о STL здесь. Я почти задумывался о злоупотреблении std :: transform или std :: merge и т. Д. Для достижения этой функциональности каким-либо образом, но я не совсем понимаю, как это сделать.

23
задан Flexo 17 September 2011 в 09:26
поделиться