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

时间:2012-10-22 09:00:40

标签: c++ boost iterator boost-multi-index

我知道以下代码不正确,对于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 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:3)

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

实际文字是:

  

保证迭代器有效性和异常安全性

     

由于Boost.MultiIndex框架强加的内部约束,哈希   索引提供了对迭代器有效性和异常安全性的保证   这实际上比C ++标准库要求的更强   关于无序关联的技术报告(TR1)   容器:

     

在插入期间或任何情况下都会保留迭代器有效性   rehashing:重新散列时TR1允许迭代器失效   (隐式或显式)执行。擦除元素或范围   通过迭代器的元素不会像内部哈希那样抛出   实际上没有调用函数和等式谓词对象。   rehash无条件地提供强大的异常安全保障。

     

如果内部哈希函数和相等,TR1只保证它   谓词对象不抛出。有些令人惊讶的结果是   符合TR1的无序关联容器可能会擦除   如果在重新散列期间抛出异常,则返回元素!一般来说,   这些更有力的保证有利于用户的便利,   特别指的是迭代器的稳定性。 A(希望如此   性能下降可能导致交换这些   但是商品。