如何解决将多个迭代器推进到同一字符串流
请查看此代码段
std::istringstream s("abc");
std::istreambuf_iterator<char> i1(s),i2(s);
std::cout<< "i1 returns "<<*i1<<'\n'
<< "i2 returns "<<*i2<<'\n';
++i1;
std::cout<<"after incrementing i1,but not i2\n"
<<"i1 returns "<<*i1<<'\n'
<<"i2 returns "<<*i2<<'\n';
++i2; // this makes the apparent value of *i2 to jump from 'a' to 'c'
std::cout << "after incrementing i2,but not i1\n"
<< "i1 returns " << *i1 << '\n'
<< "i2 returns " << *i2 << '\n';
我得到了类似的输出
a
a
b
b
c
c
这与我的预期完全不同,因为i1和i2是两个不同的迭代器。
有人帮我一个忙吗?
解决方法
来自cppreference:
std::istreambuf_iterator
是一种单遍输入迭代器,可从为其构造对象的std::basic_streambuf
对象中读取连续的字符。
这里的重要部分是单遍特性:读取值后,您将无法返回并再次读取它。回想一下,您可以将std::istreambuf_iterator
用于std::cin
。如果您从程序中的std::cin
中读取内容,则意味着您可以交互地键入字符-没有回头字符(必须将字节保存在std::string
中或类似的字符)。>
现在,当创建多个引用相同流对象的迭代器时,前进一种意味着读取字符-所有迭代器都可以看到。这是由于迭代器的单遍性质,另请参见operator*的文档:
通过调用sbuf _-> sgetc()读取单个字符,其中sbuf_是存储到流缓冲区的指针。
很明显,所有迭代器实例都共享解引用运算符使用的状态。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。