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

sun*_*mat 4 c++ boost iterator boost-multi-index

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

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

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

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

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

我想一定要了解好文件的以下段落:http://www.boost.org/doc/libs/1_51_0/libs/multi_index/doc/tutorial/indices.html#guarantees 这似乎说明我可以擦除而不会使迭代器失效.但是我不确定是否因为我删除了一个元素,在迭代期间我应该访问的另一个元素可以在当前迭代器的位置之前移动并且永远不会被访问(换句话说,通过在迭代期间擦除一些元素,我还是肯定要经历所有的元素吗?).

谢谢!

eca*_*mur 6

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

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

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

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