在 std::list 中,std::d istance(it.begin(), std::p rev(it.end()

In an std::list, is the std::distance(it.begin(), std::prev(it.end())) equal to list.size()?

本文关键字:std it rev end begin istance list      更新时间:2023-10-16

我正在发现一种我想更好地理解的行为。

我有一个包含 N 个元素std::list<int> l;,其中N>0(非空)。

然后我比较了l.begin()std::prev(l.end())之间的std::distance。我希望这等于l.size(),因为l.end()是一个不存在的迭代器,因此不应该在远处考虑。

在代码形式中,为什么:

l.size() != std::distance(l.begin(), std::prev(l.end())

编辑为什么这不是重复项

这个问题与关于区间的问题无关,因为我的问题是关于迭代器distance的性质,而不是关于l.begin()l.end()区间的性质,尽管是有用和相关的概念。我清楚地表明我使用了prev(l.begin())并说明了原因。

鉴于问题中的评论,我理解了我的概念错误,我将发布并回答说,不能保证distance()会给你size(),因为distance计数从第一个到最后一个传递的迭代器所需的增量数,而不是给定间隔内的元素数。鉴于该问题被重复数据删除器阻止,我无法回答我认为正确的答案并添加示例。

假设我们有一个大小为 1 的列表。然后l.end()是[不存在的]第二个元素(索引1),prev(l.end())是第一个元素(索引0)。然后std::distance(l.begin(), std::prev(l.end()))是 0,而它应该是 1。