如何跟踪指向STL列表元素的指针

C++: how to track a pointer to a STL list element?

本文关键字:STL 列表元素 指针 何跟踪 跟踪      更新时间:2023-10-16

我想跟踪一个指向列表元素的指针,以便下一次读访问。这个指针将在每次读取列表时被提前。假设我在删除列表元素时采取了适当的预防措施,那么将迭代器作为成员变量缓存到列表中是不是一种不好的做法?

指向列表元素的迭代器在它所指向的元素被移除之前一直有效。这是标准所保证的。

缓存迭代器是没有问题的,只要你确保你没有从列表中删除元素或者刷新缓存的迭代器。

要使用迭代器。它们不只是用于在for循环中遍历每个元素。你所要考虑的只是迭代器失效的规则。

std::vector迭代器可以通过向list中插入元素的任何操作使其失效。插入点以外所有元素的迭代器都失效,如果插入操作导致容量增加,则所有迭代器都失效。从vector中移除元素的操作将使移除点之后的所有迭代器失效。

std::deque迭代器对于在deque中任意位置添加或删除元素的操作无效。所以把这些东西放太久可能不是个好主意。

std::liststd::setstd::map迭代器只在删除迭代器所指向的特定元素时才失效。这是寿命最长的迭代器类型。

只要记住这些规则,就可以随意存储这些迭代器。存储std::list迭代器当然不是一种糟糕的形式,只要您能确保特定的元素不会去任何地方。

您能够以独立于平台和编译器的方式正确推进STL std::list<T>的唯一方法是通过使用std::list<T>::iteratorstd::list<T>::const_iterator,因此这确实是您唯一的选择,除非您计划实现自己的链表。根据标准,正如其他人在这里发布的那样,指向std::list元素的迭代器将保持有效,直到该元素从列表中删除。