Проблема в том, что istream_iterator
читает не когда разыменовывается, а когда увеличивается:
- Первое значение читается при построении
istream_iterator
- дополнительные значения iNumCount считываются copy_n при увеличении итератора
Другими словами, у вас слишком много iiBegin++
, который читает значение, которое отбрасывается. На любом классическом итераторе этот последний шаг приведет вас «к концу», но здесь он вызывает нежелательное чтение со стандартного ввода (который, очевидно, не имеет конца).
[РЕДАКТИРОВАТЬ] Возможное решение:
template<class IIT, class OIT>
OIT copy_n(IIT iitBegin, size_t szCount, OIT oitBegin)
{
*oitBegin++ = *iitBegin;
for(size_t szI = 0; (szI < szCount - 1); ++szI)
*oitBegin++ = *++iitBegin;
return oitBegin;
}