Блог пользователя RED_in_Three_Months

Автор RED_in_Three_Months, история, 5 лет назад, По-английски

Why for(auto x:st)st.erase(st.find(x)); and for( it=st.begin();it!=st.end();it++)st.erase(it); causes runtime error??

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
5 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Auto comment: topic has been updated by RED_in_Three_Months (previous revision, new revision, compare).

»
5 лет назад, # |
  Проголосовать: нравится +20 Проголосовать: не нравится

Don't know about the first example. But for the second one, once you delete using the iterator it, the element gets deleted as well as all iterators pointing to that element. Thus it gets invalidated.

There's an easy workaround. set.erase(it) returns an iterator pointing to the element next to *it. So, you could just do it = set.erase(it).

This issue has been nicely discussed here: https://codeforces.me/blog/entry/55393