为什么std :: copy_n不能在每次调用之间连续复制

时间:2018-10-22 06:10:04

标签: c++11 iterator copy

我必须找到具有以下行为的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 :(得分:1)

std::copy_n在给定参数的情况下的显示用法应导致输出

abcde
efghi

要解释以上内容,

std::copy_n(istreambuf_iterator<char>(ss), 5, str.begin());

'a'str的开头复制5个字符。 str现在是"abcde",后面是5个默认的char实例,即空字节(不打印为第一个空字节被解释为字符串的末尾)。空字节源自str.resize(10)。通话后,ss指向'e'ss的位置。下一个相同的呼叫

std::copy_n(istreambuf_iterator<char>(ss), 5, str.begin());

'e'str的开头复制5个字符。 str现在为"efghi",后跟5个空字节。

如果改为输出

abcde
abcdefghij

是需要的,您可以将std::copy_n的第二次调用更改为

std::copy_n(std::next(istreambuf_iterator<char>(ss)), 5, str.begin() + 5);

'f'的第一个空字节开始,将5个字符从str复制到str