链接列表如何知道其元素何时从列表中删除并进行调整?

时间:2014-10-15 22:42:05

标签: c++

我创建了一个单独的链表,并为它创建了一个迭代器,但是当当前指向的元素从列表中删除时,我遇到了问题。我有一个名为list的类,在其中,我有一个名为iter的嵌套类。目前iter唯一的字段是* currentNode指针(它在构造函数的节点中传递)。

那么当它指向的元素被删除时,我该如何处理呢。我的第一个想法是我应该尝试在我的列表的remove()函数中处理它,但我不认为有可能/不知道如何从列表的角度来判断当前元素是否被指向由迭代器(迭代器的currentNode指针似乎不在基于编译器错误的类的范围内)。我的第二个想法是尝试从迭代器本身处理它,但我无法弄清楚如何开始这样做。

如果答案非常简单,我很抱歉。我无法在网上任何地方找到答案,这让我觉得它可能是,但我无法弄清楚如何处理这一点对我来说。谢谢!

2 个答案:

答案 0 :(得分:1)

列表不需要了解迭代器或其内容。当迭代器从列表中删除其当前节点时,迭代器将失效。即使是大多数标准STL容器中的迭代器也表现出相同的行为。例如,如果查看std::list,其erase(iterator)方法将返回 new 迭代器,该迭代器表示节点后面的列表中的 next 节点去掉了。您可以在自己的remove()方法中执行相同的操作。否则,remove()必须更新迭代器以指向不同的节点,但这往往会违背迭代器通常的操作方式。

答案 1 :(得分:1)

您有2个选项。

  1. 如果取消引用一个不存在的对象的迭代器,则它是未定义的行为。标准库执行它并被接受。此外,它也很容易实现,因为您不需要处理这种情况。
  2. 为元素保留std::shared_ptr。这样,只要迭代器存在,就不会删除该值。即使您不使用该功能,也必须为此付出性能损失。此外,它可以被视为隐藏了一个错误。