Почему std :: copy_n не может копировать непрерывно между каждым вызовом - PullRequest
0 голосов
/ 22 октября 2018

Мне нужно найти std :: copy_n с таким поведением:

stringstream ss;
ss.str("abcdefghij");
string str;
str.resize(10);
std::copy_n(istreambuf_iterator<char>(ss), 5, str.begin());
cout << str << endl;
std::copy_n(istreambuf_iterator<char>(ss), 5, str.begin());
cout << str << endl;

Кажется, что я напечатал abcde\n efghij".

Это правильное поведениеоперации, связанные с итератором?

1 Ответ

0 голосов
/ 22 октября 2018

Показанное использование 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.

...