在下面的代码中,我试着计算两个迭代器之间的距离,迭代器从相同的位置开始,我把一个迭代器推进三次,所以我觉得它们之间的距离应该是3,但是我总是得到0,为什么?
using namespace std;
stringstream strstream{"Hello world"};
auto b = istream_iterator<char>{strstream};
auto e = istream_iterator<char>{strstream};
++e;
++e;
++e;
cout << "distance: " << distance(b,e) << endl;
3条答案
按热度按时间5us2dqdw1#
这是因为输入迭代器只能保证一次通过。下面是来自cppreference的关于
operator++
的输入迭代器的内容:++r
[...]
后处理:r的前一个值的任何副本不再需要是可解引用的或在==的定义域中。
因此,在
++e
之后,b
不再对它的价值或它是否可用有任何保证。70gysomp2#
根据cppreference:
如果两个[istream]迭代器都是流末尾迭代器或者都引用同一个流,则它们相等。
因为你的两个流迭代器引用同一个流,它们是相等的。不管你把其中一个提前。
因为它们相等,所以它们之间的距离为
0
。8fq7wneg3#
b
和e
是流迭代器,它们引用具有其读取位置的流,从输入流执行一个字符读取并存储读取的字符。它们彼此不可访问,它们相等,并且引用具有其流读取位置的流。从流中读取“H”和“e”,
++e
或++b
中的任何一个都将读取接下来的字符: