首页 文章

使用迭代器从boost多索引中删除项目时的一致性

提问于
浏览
4

我知道以下代码不正确,对于std :: vectors,更常见的是所有STL容器:

std::vector<something>::iterator it = array.begin();
for(; it != array.end(); it++) {
   ...
   array.erase(it);
   ...
}

因为在擦除和元素之后需要更新迭代器 .

我想知道升压多指数是否相同,例如以下内容是否正确:

my_index::iterator it = index.get<0>().begin();
for(; it != index.get<0>().end(); it++) {
   ...
   index.erase(it);
   ...
}

我想确保理解文档的以下段落:http://www.boost.org/doc/libs/1_51_0/libs/multi_index/doc/tutorial/indices.html#guarantees这似乎表明我可以擦除而不会使迭代器失效 . 但是我的位置永远不会被访问(换句话说,通过在迭代期间擦除一些元素,我仍然可以通过所有元素吗?) .

谢谢!

2 回答

  • 3

    您链接的段落仅适用于散列(无序)索引 . 它声明在插入新元素时,散列索引迭代器仍然有效 .

    擦除时,对于有序索引,您始终可以使用 erase 的返回值保证完整迭代:

    for (; it != index.get<0>().end(); ) {
        if (...) it = index.erase(it);
        else ++it;
    }
    

    这也适用于散列(无序)索引,因为迭代顺序在擦除元素上是稳定的 .

  • 6

    不,您的操作在提升索引中无效 . 从集合中删除的迭代器永远不会保持有效,如果您将它们存储在某个地方,那么集合中的其他迭代器仍然有效 .

    实际文本是:

    对迭代器有效性和异常安全性的保证由于Boost.MultiIndex框架施加的内部约束,散列索引提供了对迭代器有效性和异常安全性的保证,实际上比C标准库技术报告(TR1)所要求的更强 . 无序关联容器:在插入或重新散列期间,迭代器有效性在任何情况下都会被保留:TR1允许在执行rehash(隐式或显式)时使迭代器失效 . 通过迭代器擦除元素或元素范围不会抛出,因为实际上没有调用内部散列函数和等式谓词对象 . rehash无条件提供强大的异常安全保障 . 如果内部散列函数和等式谓词对象不抛出,TR1仅保证它 . 有些令人惊讶的结果是,如果在重新散列期间抛出异常,符合TR1的无序关联容器可能会擦除元素!通常,这些更强的保证有利于用户的方便,特别是涉及迭代器稳定性的方便 . 但是,(希望最小的)性能下降可能导致这些商品的交换 .

相关问题