2016-07-12 18 views
0

Ich arbeite mit Sets für eine Übung, und ich habe eine Fehlermeldung, die ich nicht interpretieren kann. Ich bin nicht so versiert mit den technischen Aspekten der Programmierung. Ich bin ein Mathe-Student, also habe ich mich nur wirklich auf die eigentliche Programmierung konzentriert, also gewisse Fehler, mit denen ich einfach nicht umgehen kann.C++ Fehler mit Std :: Set

Ich machte den Satz und eingefügt jede ganze Zahl von 0 bis 100 mit den Endpunkten. Ich wollte dann jede durch 2 teilbare ganze Zahl außer 2 selbst löschen. Hier ist der Code:

set<int> intSet; 
for (int i = 0; i < 101; i++) { 
    intSet.insert(i); 
} 

for (set<int>::iterator twoDivIt = intSet.begin(); twoDivIt != intSet.end(); twoDivIt++) { 
    if (*twoDivIt % 2 == 0) { 
     if (*twoDivIt == 2) { 
      continue; 
     } 
     else { 
      intSet.erase(twoDivIt); 
     } 
    } 
} 

for (set<int>::iterator it = intSet.begin(); it != intSet.end(); it++) { 
    std::cout << *it << "\t"; 
} 

ich ein Popup-Fenster bekommen sagen mir die debuc Behauptung nicht, und dass „Karte/set Iterator nicht inkrementierbarer“. Was habe ich falsch gemacht?

+0

löschen, während das Iterieren eine wirklich schlechte Idee ist. – tkausl

+0

Ist es in diesem Fall besser, ganze Zahlen zu durchlaufen und die zu löschen, die ich löschen möchte? – Auclair

+0

Warum fügen Sie sogar alle Ganzzahlen hinzu? Anstatt alle zu addieren und die geraden zu entfernen, könntest du nur die ungeraden hinzufügen. – tkausl

Antwort

0

sollte die Schleife aussehen

for (std::set<int>::const_iterator twoDivIt = intSet.begin(); twoDivIt != intSet.end();) 
{ 
    if (*twoDivIt % 2 == 0 && *twoDivIt != 2) twoDivIt = intSet.erase(twoDivIt); 
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    else ++twoDivIt; 
} 

Wenn der Compiler 11 den C++ nicht unterstützt, dann kann die Schleife Einträge sehen aus wie

for (std::set<int>::const_iterator twoDivIt = intSet.begin(); twoDivIt != intSet.end();) 
{ 
    if (*twoDivIt % 2 == 0 && *twoDivIt != 2) intSet.erase(twoDivIt++); 
    else ++twoDivIt; 
} 
+0

Gibt die Löschelementfunktion einen Iterator zurück? Ich dachte es nicht – Auclair

+0

@Auclair Wenn Sie einen Compiler verwenden, der mindestens C++ 11 unterstützt, dann gibt die Erase-Methode Iterator zurück. –

+0

Ich benutze Visual C++ 2015, also sollte es C++ 11 unterstützen. Und dein erster Vorschlag hat wunderbar funktioniert, danke! – Auclair

Verwandte Themen