c++ 为什么std::distance返回零?

3phpmpom  于 2023-03-14  发布在  其他
关注(0)|答案(3)|浏览(153)

在下面的代码中,我试着计算两个迭代器之间的距离,迭代器从相同的位置开始,我把一个迭代器推进三次,所以我觉得它们之间的距离应该是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;
5us2dqdw

5us2dqdw1#

这是因为输入迭代器只能保证一次通过。下面是来自cppreference的关于operator++的输入迭代器的内容:
++r
[...]
后处理:r的前一个值的任何副本不再需要是可解引用的或在==的定义域中。
因此,在++e之后,b不再对它的价值或它是否可用有任何保证。

70gysomp

70gysomp2#

根据cppreference
如果两个[istream]迭代器都是流末尾迭代器或者都引用同一个流,则它们相等。
因为你的两个流迭代器引用同一个流,它们是相等的。不管你把其中一个提前。
因为它们相等,所以它们之间的距离为0

8fq7wneg

8fq7wneg3#

be是流迭代器,它们引用具有其读取位置的流,从输入流执行一个字符读取并存储读取的字符。它们彼此不可访问,它们相等,并且引用具有其流读取位置的流。

stringstream strstream{"Hello world"};

auto b = istream_iterator<char>{strstream};
cout << "char: " << *b << endl;  // char: H

auto e = istream_iterator<char>{strstream};
cout << "char: " << *e << endl;  // char: e

从流中读取“H”和“e”,++e++b中的任何一个都将读取接下来的字符:

++b;
cout << "char: " << *b << endl;  // char: l - NOT char: e
++e;
++e;
cout << "char: " << *b << endl;  // char: o - NOT char: e

相关问题