Как удалить несколько элементов из boost::multi_index?

Я пытаюсь сделать что-то вроде этого:

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 не работает, так как он изменяет и перезаписывает элементы в контейнере, что испортит другие индексы. Каков рекомендуемый способ сделать что-то подобное?

Спасибо!


person Niko    schedule 15.08.2018    source источник
comment
Почему бы не использовать перегрузку iterator erase(iterator first,iterator last)?   -  person n. 1.8e9-where's-my-share m.    schedule 15.08.2018
comment
Возможный дубликат Согласованность при удалении элементов из boost multi -index с помощью итератора   -  person Joaquín M López Muñoz    schedule 15.08.2018
comment
@н.м. потому что я не хочу стирать все в диапазоне, а только те, которые отфильтрованы с помощью somePredicate.   -  person Niko    schedule 16.08.2018


Ответы (1)


person    schedule
comment
Это по-прежнему оставит итератор недействительным, если somePredicate, и поэтому не решит проблему оператора. - person kabanus; 15.08.2018
comment
Решение, предложенное в другом вопросе, который вы связали с проверками iter != myIndex.end() в цикле for, который работает, потому что end() продолжает обновляться, когда мы стираем элементы. Однако в моем случае я фильтрую диапазон, а не весь multi_index, поэтому у нас нет этого преимущества. - person Niko; 16.08.2018
comment
Итераторы Boost.MultiIndex всегда стабильны, что означает, что код, который я предлагаю, совершенно безопасен --range.second остается действительным на протяжении всего цикла. - person Joaquín M López Muñoz; 16.08.2018