为什么 std::distance 返回零?

dB'*_*dB' 6 c++

在下面的代码中,我尝试计算两个迭代器之间的距离。迭代器从相同的位置开始,我将 1 前进 3 次,所以我觉得它们之间的距离应该是 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;
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 11

这是因为输入迭代器仅保证单次传递。以下内容来自cppreference关于operator++输入迭代器的内容:

++r

[...]

后置条件:r 先前值的任何副本不再需要可取消引用或位于 == 的域中。

因此,之后++eb不再对其价值或是否可用提供任何保证。

  • 事实上,它似乎是有明确定义的。`istream_iterator` 相等性基于两个迭代器是否指向同一个流。递增和获取值取决于它们指向的流,复制也是如此。所以它是明确定义的......两个迭代器都指向同一个地方。因此,“距离”*必须*为零。 (2认同)

Dre*_*ann 7

根据cppreference

如果两个 [istream] 迭代器都是流尾迭代器或者它们都引用相同的流,则它们相等。

因为您的两个流迭代器引用同一个流,所以它们是 equal 的。你进步其中之一并不重要。

由于它们是相等的,因此它们之间存在0距离。