Usando set.insert (chiave) come condizionale?
-
03-07-2019 - |
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
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.
}