Показанное использование std::copy_n
с указанными аргументами должно привести к выводу
abcde
efghi
Чтобы объяснить вышесказанное,
std::copy_n(istreambuf_iterator<char>(ss), 5, str.begin());
копирует 5 символов, начиная с 'a'
к началу str
.str
теперь "abcde"
, за которым следуют 5 экземпляров char
по умолчанию, т. Е. Нулевые байты (которые не печатаются, поскольку первый нулевой байт интерпретируется как конечный страж строки).Нулевые байты происходят от str.resize(10)
.После этого вызова ss
указывает на позицию 'e'
в ss
.Следующий идентичный вызов
std::copy_n(istreambuf_iterator<char>(ss), 5, str.begin());
копирует 5 символов, начиная с 'e'
и заканчивая str
.str
теперь "efghi"
, за которым следуют 5 нулевых байтов.
Если вместо этого требуется вывод
abcde
abcdefghij
, вы можете изменить второй вызов std::copy_n
на
std::copy_n(std::next(istreambuf_iterator<char>(ss)), 5, str.begin() + 5);
, который копирует 5 символов, начиная с 'f'
до str
, начиная с первого нулевого байта str
.