Согласованность при удалении элементов из мультииндекса Boost с помощью итератора

Я знаю, что следующий код некорректен для std :: vectors и, в более общем случае, для всех контейнеров STL:

std::vector<something>::iterator it = array.begin();
for(; it != array.end(); it++) {
...
array.erase(it);
...
}

потому что итератор должен быть обновлен после стирания и элемента.

Мне было интересно, будет ли это то же самое для бустового мультииндекса, например, будет ли что-то вроде следующего правильным или нет:

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
который, кажется, утверждает, что я могу стереть, не отменяя итератор. Однако я не уверен, что из-за того, что я удаляю элемент, другой элемент, который я должен был бы посетить во время итерации, может быть перемещен до позиции текущего итератора и никогда не будет посещен (другими словами, путем удаления некоторых элементов во время итерации, я все еще уверен пройти все элементы?).

Спасибо!

4

Решение

Связанный вами абзац применяется только к хешированным (неупорядоченным) индексам. В нем говорится, что когда вставка новые элементы, итераторы хешированного индекса остаются действительными.

При удалении упорядоченных индексов вы всегда можете гарантировать полную итерацию, используя возвращаемое значение из erase:

for (; it != index.get<0>().end(); ) {
if (...) it = index.erase(it);
else ++it;
}

Это также будет работать для хешированных (неупорядоченных) индексов, так как порядок итераций стабилен при удалении элементов.

6

Другие решения

Нет, ваше действие недопустимо в индексе повышения. Итераторы, удаленные из коллекции, никогда не остаются действительными. То, что может оставаться действительным, это другие итераторы в коллекции, если вы где-то их храните.

Фактический текст:

Гарантии действительности итераторов и исключительной безопасности

Из-за внутренних ограничений, накладываемых платформой Boost.MultiIndex, хешируется
индексы дают гарантии на действительность итераторов и безопасность исключений
которые на самом деле сильнее, чем требуется стандартной библиотекой C ++
Технический отчет (TR1) относительно неупорядоченного ассоциативного
контейнеры:

Действительность итератора сохраняется в любом случае во время вставки или
перефразировка: TR1 допускает аннулирование итератора при перефразировке
(неявное или явное) выполняется. Стирание элемента или диапазона
элементы через итераторы не выкидывает никогда, так как внутренний хеш
объекты-предикаты функции и равенства фактически не вызываются.
Перефразирование безоговорочно обеспечивает надежную гарантию безопасности.

TR1 только гарантирует это, если внутренняя хеш-функция и равенство
объекты-предикаты не выбрасывают. Несколько удивительное последствие
что TR1-совместимый неупорядоченный ассоциативный контейнер может стереть
элементы, если исключение выдается во время перефразировки! В общем,
эти более сильные гарантии играют в пользу удобства пользователя,
особенно то, что относится к стабильности итератора. A (надеюсь,
минимальное) снижение производительности может привести к замене этих
товары, хотя.

3