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

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

我知道下面的代码对于 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/

相关文章:

c++ - 我不明白为什么我生成的随机数没有正确存储

c++ - 高效值类型

c++ - 使用CMake时出现"Could not find boost libraries"错误

scala - 如何将 Scalding TypedPipe 转换为 Iterator

c++迭代器,替代语法?

c++ - 复制分配构造函数中的 aligned_alloc 内存块在释放时崩溃

c++ - 如何强制 gcc 从库中链接未引用的静态 C++ 对象

c++ - 我使用什么函数来在 cin 语句中存储单个字符,以便我可以单独处理每个字符?

c++ - 如果不是json,但类似,如何使用boost解析?

c++ - 构造函数中的 noob Iterator 运行时错误