在std :: list中,std :: distance(it.begin(),std :: prev(it.end())是否等于list.size()? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在std :: list中,std :: distance(it.begin(),std :: prev(it.end())是否等于list.size()? [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我发现了一种我想要更好理解的行为。

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

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

在代码形式中,为什么:

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

编辑为什么这不重复

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

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

答案

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

以上是关于在std :: list中,std :: distance(it.begin(),std :: prev(it.end())是否等于list.size()? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

循环在 std::list 上为迭代的 std::erase 挂起

为啥从 std::vector 中随机删除比 std::list 快?

从嵌套在 std::map 中的 std::list 中删除元素的最佳方法

Visual Studio 调试器:轻松查看 std::list(和其他 std 容器)

使用 SWIG 在 Python 中公开 std::list 成员

std::vector 与 std::list 与 std::slist 的相对性能?