[英]C++: how to track a pointer to a STL list element?
我想跟踪指向下一个读访问的列表元素的指针。 每次读取列表时,该指针都会前进。 假设我在删除列表元素时采取了适当的预防措施,将迭代器作为成员变量缓存到列表是不好的做法?
列表元素的迭代器保持有效,直到它引用的元素被删除。 这是标准的保证。
只要确保不从列表中删除元素或在执行时刷新缓存的迭代器,缓存迭代器就没有问题。
迭代器是要使用的。 它们不仅仅用于循环for循环中的每个元素。 所有你必须考虑的是迭代器失效的规则。
任何将元素插入列表的操作都可以使std::vector
迭代器无效。 超出插入点的所有元素的迭代器都将失效,并且如果插入操作导致容量增加,则所有迭代器都将失效。 从向量中删除元素的操作将在删除点之后使任何迭代器无效。
任何在双端队列中的任何位置添加或删除元素的操作都会使std::deque
迭代器无效。 因此,将这些保持很长时间可能不是一个好主意。
std::list
, std::set
和std::map
迭代器仅通过特定删除迭代器引用的特定元素而失效。 这些是迭代器类型中寿命最长的。
只要记住这些规则,就可以随意存储这些迭代器。 存储std::list
迭代器肯定是不错的形式,只要你能确定那个特定的元素不会去任何地方。
通过使用std::list<T>::iterator
或std::list<T>::const_iterator
能够通过平台和编译器独立方式正确推进STL std::list<T>
的唯一方法是std::list<T>::const_iterator
,除非你计划实现自己的链表,否则这是你唯一的选择。 根据标准,正如其他人发布的那样, std::list
元素的迭代器将保持有效,直到从列表中删除该元素。
您所询问的内容称为“输入迭代器”,快速搜索将为您提供高质量的实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.