Iterator invalidation

Feb 17, 2010 15:43

Не варто покладатись на магію слів "Multimap has the important property that inserting a new element into a multimap does not invalidate iterators that point to existing elements. Erasing an element from a multimap also does not invalidate any iterators, except, of course, for iterators that actually point to the element that is being erased." із документації SGI на std::multimap. Точніше покладатись можна, тільки читати треба уважно. Уявімо що у нас є контейнер типу std::multimap. Якимось чином (наприклад, за допомогою equal_range) ми отримуємо діапазон ітераторів і "проходимо" по цьому діапазону. Все в порядку навіть якщо ми робимо erase(position++) (зверніть увагу на пост-інкремент). Можна навіть зробити кілька insert під час ітерації - діапазон залишиться валідним.
Я близько 2 годин намагався придумати ситуацію у якій цей діапазон перестане бути валідним під час ітерації, і таки придумав. Достатньо видалити праву межу діапазону і ітерація ніколи не завершиться. Такі справи...
А на закуску - слайди по темі: Invalidation of STL iterators (PDF).

cpp, програмування

Previous post Next post
Up