我必须找到具有以下行为的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"
。
这是迭代器相关操作的正确行为吗?
答案 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
。