0

我的意思是在迭代器指向同一个元素的情况下。

http://www.cplusplus.com/reference/stl/list/erase/上说“从列表容器中删除单个元素(位置)或一系列元素([first,last))。” 和“第一个,最后一个迭代器,指定要删除的列表容器内的范围:[first,last)。即,该范围包括第一个和最后一个之间的所有元素,包括第一个指向的元素,但不包括最后一个指向的元素。 "

我完全不知道我是否做错了所有事情,但是对于我的代码的每一部分,我在任何地方都找不到所需的信息,当我想自己测试它时,我会遇到一种情况,当我不知道发生了什么时在这里询问并争论了很长时间后,我发现了“未定义的行为”之类的东西。那么有人可以更快地帮助我,现在是什么?

而且我想成为更好的程序员并找到比 cplusplus.com 和 cppreference.com 更好的源代码,因为它们都很烂,还有更好的吗?我每天都在用这个 C++ 变得更疯狂(但我仍然认为它比 Java 或 C 更适合快速的大型程序),请帮忙。

4

2 回答 2

9

标准自己的范围定义(24.2.1p7,强调我的):

对数据结构进行操作的大多数库算法模板都有使用范围的接口。范围是一对指定计算开始和结束的迭代器。范围[i,i)是一个空范围;一般来说,范围[i,j)是指数据结构中的元素,从 指向的元素开始,i直到但不包括 指向的元素j

因此,假设it是一个有效的迭代器lst,则该调用lst.erase(it,it)会从 中删除一组空元素lst。也就是说,它什么都不做。

于 2012-09-20T20:46:53.417 回答
2

我认为要最好地回答您的问题,您应该考虑迭代器的工作原理以及为什么所有内容都作为 [first, last) 而不是其他东西传入。

您需要牢记关于迭代器的两个核心规则。您始终可以递增一个(即 first++),并且指向同一元素的两个迭代器将始终相等。知道了这一点,您可以使用以下逻辑遍历任何范围的迭代器:

for(; first != last; first++)
{
}

因此,如果第一个和最后一个相等,则不会发生任何事情。所以如果你调用 list.erase(it, it) 什么都不会被删除。

把它放在更一般的形式。STL 中 first == last 的任何范围实际上都是空的。

于 2012-09-20T20:42:40.440 回答