【问题标题】:What is the lifetime and validity of C++ iterators?C++ 迭代器的生命周期和有效性是多少?
【发布时间】:2010-10-20 01:05:05
【问题描述】:

我计划在 C++ 中实现一个事物列表,其中元素可能会被乱序删除。我不希望我需要任何类型的随机访问(我只需要定期扫描列表),并且项目的顺序也不重要。

所以我认为 std::list<Thing*> with this->position = insert(lst.end(), thing) 应该可以解决问题。我希望 Thing 类记住每个实例的位置,以便以后可以在恒定时间内轻松地执行 lst.erase(this->position)。

但是,我对 C++ STL 容器还是有点陌生​​,我不知道将迭代器保留这么长时间是否安全。特别是考虑到在插入的 Thing 消失之前和之后会有其他元素被删除。

【问题讨论】:

    标签: c++ stl iterator object-lifetime


    【解决方案1】:

    在列表中,所有迭代器在插入过程中保持有效,只有擦除元素的迭代器在擦除过程中变得无效。

    在您的情况下,即使在插入的 Thing* 前后删除其他元素时,保持迭代器也应该没问题。

    编辑:

    vector 和 deque 的更多细节:

    向量:

    • inserting --- 所有迭代器得到 如果发生重新分配则无效, 否则有效。
    • 擦除----之后的所有迭代器 擦除点无效。

    双端队列:

    • inserting --- 所有迭代器得到 无效。
    • 擦除 ---- 所有迭代器得到 无效。

    【讨论】:

    • 很好的答案,这也有助于了解可能导致向量重新分配的原因。 (插入一个元素是显而易见的,但还有其他的吗?)
    • 允许对向量的任何修改(插入和删除)重新分配和使迭代器无效;是否这样做是实现定义的。所以你最好假设以任何方式修改向量总是会使所有现有的迭代器无效。
    【解决方案2】:

    这取决于您使用的容器。

    检查:http://www.sgi.com/tech/stl/
    最后查看每个容器文档,它们将描述迭代器保持有效的条件。

    对于 std::list 它们在所有条件下都保持有效,直到它们实际引用的元素从容器中删除(此时它们是无效的)。

    【讨论】:

    • 感谢您的信息。我已经在使用 SGI 的文档,但我想我忽略了注释,没有注意到答案。
    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2017-03-31
    相关资源
    最近更新 更多