Я пытаюсь посчитать количество элементов, прочитанных std::cin
используя std::distance
для аргумента конструктора вектора заранее, вот так:
// Gives correct amount, but now can't use to put into vector
int size = std::distance(std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>());
std::vector v(size);
// Already read from stream
std::copy(...);
Очевидно, я могу завершить это в один шаг с std::copy
, но это потребует установки размера заранее. Мой вопрос не о векторах, а о размере произвольного ввода, используя std::istream_iterator
не влияя на поток. Есть идеи?
std::istream_iterator
является InputIterator
, это означает, что он поддерживает только один проход в диапазоне, который вы повторяете. Там нет никакого способа, чтобы выяснить размер, а затем вернуться к началу, чтобы прочитать данные.
Вы можете прочитать из std::cin
(или любой другой входной поток), используя std::copy
не зная размера заранее, просто используйте std::back_inserter
добавить данные для чтения в vector
,
std::vector v;
std::copy( std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>(),
std::back_inserter(v) );
Других решений пока нет …