【问题标题】:How to remove multiple elements from a boost::multi_index?如何从 boost::multi_index 中删除多个元素?
【发布时间】:2018-08-15 01:06:22
【问题描述】:

我正在尝试做这样的事情:

auto& myIndex = myMultiIndex.get<0>();
auto range = myIndex.equal_range(x);
for (auto iter = range.first; iter != range.second; ++iter) {
    if (somePredicate) myIndex.erase(iter);
}

当然这不起作用,因为一旦我们从容器中删除一个元素,迭代器就会变得无效。 std::remove_if 也不起作用,因为它会修改和覆盖容器中的元素,这会弄乱其他索引。做这种事情的推荐方法是什么?

谢谢!

【问题讨论】:

标签: c++ boost-multi-index


【解决方案1】:
for (auto iter = range.first; iter != range.second;) {
    if (somePredicate) iter = myIndex.erase(iter);
    else ++iter;
}

【讨论】:

  • 如果somePredicate,这仍然会使迭代器无效,因此不能解决op的问题。
  • 您链接到的另一个问题中建议的解决方案在 for 循环中检查 iter != myIndex.end() ,因为 end() 在我们擦除元素时会不断更新。但是在我的情况下,我过滤的是一个范围而不是整个 multi_index,所以我们没有这个好处。
  • Boost.MultiIndex 迭代器总是稳定,这意味着我建议的代码是完全安全的——range.second 在整个循环中保持有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多