Сегодня я столкнулся с очень похожей проблемой, и вот пример:
#include <iostream>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <string>
struct A
{
float a[3];
unsigned short int b[6];
};
void ParseLine( const std::string & line, A & a )
{
std::stringstream ss( line );
std::copy_n( std::istream_iterator<float>( ss ), 3, a.a );
std::copy_n( std::istream_iterator<unsigned short int>( ss ), 6, a.b );
}
void PrintValues( const A & a )
{
for ( int i =0;i<3;++i)
{
std::cout<<a.a[i]<<std::endl;
}
for ( int i =0;i<6;++i)
{
std::cout<<a.b[i]<<std::endl;
}
}
int main()
{
A a;
const std::string line( "1.1 2.2 3.3 8 7 6 3 2 1" );
ParseLine( line, a );
PrintValues( a );
}
Компиляция приведенного выше примера с помощью g ++ 4.6.3 приводит к следующему:
1.1 2.2 3.3 7 6 3 2 1 1
, а компиляция с g ++ 4.7.2 дает другой результат:
1.1 2.2 3.3 8 7 6 3 2 1
Стандарт c ++ 11 говорит об этом copy_n
:
template<class InputIterator, class Size, class OutputIterator>
OutputIterator copy_n(InputIterator first, Size n, OutputIterator result);
Эффекты: для каждого неотрицательного целого числа i
Возвращает: результат + n.
Сложность: ровно n заданий.
Как видите, не указано, что именно происходит с итераторами, что означает, что он зависит от реализации.
Мое мнение таково, что в вашем примере не следует читать 3-е значение, а это означает, что в стандарте есть небольшой недостаток: в нем не указано поведение.