Frage

Ich versuche set.insert (key) als bedingter zu verwenden, wobei, wenn der Schlüssel richtig eingelegt ist (was bedeutet, dass der Schlüssel nicht bereits in dem Satz vorhanden ist), dann sollte es weitergehen und eine Art von Code auszuführen. Zum Beispiel so etwas wie:

if (set.insert( key )) {
    // some kind of code
}

Ist das erlaubt? Da die Compiler diesen Fehler werfen:

conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal
War es hilfreich?

Lösung

Die Version des Einsatzes, der einen einzelnen Schlüsselwert nimmt sollte eine std::pair<iterator,bool> zurück, wo der Boolesche zeigt an, ob eine Insertion gemacht wurde. Der Wert true gibt an, dass der Wert eingefügt wurde, und falsch anzeigt, dass der Wert bereits vorhanden war. So Ihre bedingte würde wie folgt aussehen:

if( set.insert( key ).second ) {
      // code
}

Andere Tipps

set :: insert ein Paar gibt, versuchen Sie dies:

if( set.insert( key ).second ) {
    // some kind of code
}

Andere Antworten haben vorgeschlagen, nur ‚.SECOND‘ verwenden, und dies funktionieren wird - aber wenn die Verarbeitung, die Sie benötigen den bestehenden Eintrag in der Gruppe ausführen verwendet, dann können Sie das vollständige Ergebnis des Einsatzes speichern:

std::pair<std::set<key>::iterator, bool> iResult = set.insert (key);
if (iResult.second) {
    // some kind of code - insert took place
}
else {
    // some kind of code using iResult.first, which
    // is an iterator to the previous entry in the set.
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top