【发布时间】:2015-12-24 08:18:32
【问题描述】:
我很难理解这个概念。从这个thread这里声明
双端队列要求任何对前面或后面的插入都应保持 对成员元素的任何引用都有效。迭代器可以 无效,但成员本身必须留在同一个地方 记忆。
我对@987654322@线程的印象
指针实际上是一种迭代器。其实对于一些容器类型,对应的迭代器可以是 简单地实现为指针。
如果我们有一个指针和一个迭代器,它们都引用相同的 容器的元素,那么任何使容器无效的操作都会 使另一个无效。
所以如果迭代器失效,那么引用也会失效。 我的问题是这怎么可能。如果指向某个内存地址的迭代器失效,那么对该地址的引用如何有效?
更新:
我知道双端队列是由随机的内存块实现的,这些内存块由独立的数据结构(例如动态数组)跟踪。但是,我很难理解迭代器如何无效但引用可能有效,因为本质上迭代器是数据结构内容的通用指针。这让我觉得迭代器可能指向其他东西,而指针指向实际项目?考虑下面的向量图。
根据我在上图中对向量的理解,如果指针的内容发生变化,迭代器也会发生变化。 deque 有什么不同。
【问题讨论】:
-
请注意,通常
iterator不是pointer并且引用类型 与reference_type不同,后者是容器在STL 中返回的。 -
因为
deque通常是通过多个分配(“页面”)实现的,这些分配由额外的类似数组的数据结构管理。添加元素时可能需要重新分配该数据结构,但不必重新分配“页面”。 -
@dyp 你是说迭代器指向数据结构的内容而不是页面?
-
您是否尝试过查看
deque的实现?也许是你的编译器附带的那个。也可以使用调试器跟踪一些操作。 -
虽然迭代器必须引用它所指向的实际元素,但它还必须知道页面数组,因为它需要能够从一个页面跳转到另一个页面。所以它包含两条信息,例如两个指针,页面数组的信息可以在这里失效。
标签: c++ pointers iterator deque