C++11 为什么std::copy\n不能在每次调用之间连续复制

C++11 为什么std::copy\n不能在每次调用之间连续复制,c++11,iterator,copy,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(

我找到了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;
stringstreamss;
ss.str(“abcdefghij”);
字符串str;
str.resize(10);
std::copy_n(istreambuf_迭代器(ss),5,str.begin());

cout显示的带有给定参数的
std::copy\n
用法应该会产生一个输出

abcde
efghi
为了解释上述情况

std::copy_n(istreambuf_iterator<char>(ss), 5, str.begin());
将从
'e'
开始的5个字符复制到
str
的开头
str
现在是
“efghi”
后跟5个空字节

如果不是,而是输出

abcde
abcdefghij
如果需要,您可以将
std::copy\n
的第二次调用更改为

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

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

让我感到奇怪的是,在第一次复制操作后,
ss
不会指向
f
?如果
ss
在开始时指向
'a'
,为什么在五次读取操作后它不指向
'f'
?在两次
copy
操作后,我们不应该得到
abcde
fghij
吗?我同意这种行为不是绝对明显的。但是通过这种方式,
std::copy\u n
只执行它对输入迭代器绝对需要执行的操作:从中读取
n
次,增加
n-1
次。可能是有人想重用上次复制的元素—从文件读取时,
n
增量(而不是
n-1
)使最后一个字符无法访问。
std::copy_n(std::next(istreambuf_iterator<char>(ss)), 5, str.begin() + 5);