gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:03 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com