Расстояние между istream_iterators

Я пытаюсь посчитать количество элементов, прочитанных 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 не влияя на поток. Есть идеи?

3

Решение

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) );
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]