我知道下面的代码对于 std::vectors 和更普遍的所有 STL 容器来说是不正确的:
std::vector<something>::iterator it = array.begin();
for(; it != array.end(); it++) {
...
array.erase(it);
...
}
因为删除元素后需要更新迭代器。
我想知道 boost 多索引是否相同,例如,下面的内容是否正确:
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 这似乎表明我可以在不使迭代器无效的情况下删除。但是我不确定是否因为我删除了一个元素,我应该在迭代期间访问的另一个元素可以移动到当前迭代器的位置之前并且永远不会被访问(换句话说,通过在迭代期间删除一些元素,我仍然确定要完成所有要素吗?)。
谢谢!
最佳答案
您链接的段落仅适用于散列(无序)索引。它声明当插入新元素时,散列索引迭代器保持有效。
删除时,对于有序索引,您始终可以使用 erase
的返回值来保证完成迭代:
for (; it != index.get<0>().end(); ) {
if (...) it = index.erase(it);
else ++it;
}
这也适用于散列(无序)索引,因为迭代顺序在删除元素时是稳定的。
关于c++ - 使用迭代器从 boost 多索引中删除项目时的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13007954/