Я построил минимальный рабочий пример, чтобы показать проблему, с которой я столкнулся, используя итераторы STL. Я использую istream_iterator для чтения floats (или других типов) из 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!
}
Это читает все возможные floats s, пока EOF в values, который имеет фиксированный размер, 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);
Но (довольно предсказуемо) это не компилируется, нет кандидатов для operator+:
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" pre-С++ 0x способ достичь этого? Очевидно, я мог бы написать это как цикл for, но я хочу узнать что-то о STL здесь. Я немного подумал о злоупотреблении std::transform или std::merge и т.д., Чтобы как-то добиться этой функциональности, но я не могу понять, как это сделать.