Domanda

Sto provando a usare set.insert (key) come condizionale, dove se la chiave è inserita correttamente (nel senso che la chiave NON esiste già nel set) allora dovrebbe continuare ed eseguire un qualche tipo di codice. Ad esempio, qualcosa del tipo:

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

È permesso? Perché il compilatore sta generando questo errore:

conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal
È stato utile?

Soluzione

La versione di insert che accetta un singolo valore di chiave dovrebbe restituire un std::pair<iterator,bool>, dove il valore booleano indica se è stato effettuato un inserimento. Un valore true indica che il valore è stato inserito e false indica che il valore era già presente. Quindi il tuo condizionale sarebbe simile al seguente:

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

Altri suggerimenti

set :: insert restituisce una coppia, prova questo:

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

Altre risposte hanno suggerito di usare solo '.second', e questo funzionerà, ma se l'elaborazione che devi eseguire usa la voce esistente nel set, puoi archiviare il risultato completo dell'inserto:

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.
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top