2013-12-17 12 views
8

Jak mogę usunąć elementy z std::set podczas iteracji nad nimJak usunąć elementy z std :: set podczas iteracji nad nim

Moja pierwsza próba wygląda następująco:

set<T> s; 

for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) { 
    //Do some stuff 
    if(/*some condition*/) 
     s.erase(iter--); 
} 

Ale to jest problematyczne jeśli chcemy usunąć pierwszy element z zestawu, ponieważ iter-- unieważnia iterator.

Jaki jest standardowy sposób, aby to zrobić?

Odpowiedz

13

standardowym sposobem jest zrobić coś takiego

for(set<T>::iterator iter = s.begin(); iter != s.end();) 
{ 
    if(/*some condition*/) 
    { 
     s.erase(iter++); 
    } 
    else 
    { 
     ++iter; 
    } 
} 

Przez pierwszy warunek jesteśmy pewni, że iter nie zostaną unieważnione w każdym razie, ponieważ kopia iter zostaną przekazane do kasowania, ale nasz iter jest już inkrementowane, przed wywołaniem kasowania.

w C++ 11, kod będzie jak

for(set<T>::iterator iter = s.begin(); iter != s.end();) 
{ 
    if(/*some condition*/) 
    { 
     iter = s.erase(iter); 
    } 
    else 
    { 
     ++iter; 
    } 
} 
+0

Pierwszy peice kodu nie twierdzenie mówi, że iteratory są niezgodne w Studion wizualnej. W każdym razie, std :: erase zwraca nowy iterator, jak wskazałeś w swoim kodzie. – sajas

Powiązane problemy