Question

J'essaie d'utiliser set.insert (key) en tant que condition, dans lequel, si la clé est insérée correctement (ce qui signifie que la clé n'existe PAS déjà dans l'ensemble), elle doit continuer et exécuter une sorte de code. Par exemple, quelque chose comme:

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

Est-ce autorisé? Parce que le compilateur renvoie cette erreur:

conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal
Était-ce utile?

La solution

La version d'insertion qui prend une valeur de clé unique doit renvoyer un std::pair<iterator,bool>, où la valeur booléenne indique si une insertion a été effectuée. La valeur true indique que la valeur a été insérée et la valeur false indique que la valeur était déjà présente. Donc, votre conditionnel ressemblerait à ceci:

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

Autres conseils

set :: insert renvoie une paire, essayez ceci:

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

D'autres réponses ont suggéré d'utiliser simplement '.second', et cela fonctionnera - mais si le traitement que vous devez effectuer utilise l'entrée existante dans l'ensemble, vous pouvez alors stocker le résultat complet de l'insertion:

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.
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top