¿Usando set.insert (key) como condicional?
-
03-07-2019 - |
Pregunta
Estoy tratando de usar set.insert (key)
como condicional, donde si la clave se inserta correctamente (lo que significa que la clave NO existe en el conjunto), debería continuar y realizar algún tipo de código. Por ejemplo, algo como:
if (set.insert( key )) {
// some kind of code
}
¿Está permitido? Debido a que el compilador arroja este error:
conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal
Solución
La versión de inserción que toma un solo valor de clave debería devolver un std::pair<iterator,bool>
, donde el valor de bool indica si se realizó una inserción. Un valor de verdadero indica que el valor se insertó, y falso indica que el valor ya estaba presente. Entonces su condicional se vería así:
if( set.insert( key ).second ) {
// code
}
Otros consejos
set :: insert devuelve un par, intente esto:
if( set.insert( key ).second ) {
// some kind of code
}
Otras respuestas han sugerido simplemente usar '.second', y esto funcionará, pero si el procesamiento que necesita realizar utiliza la entrada existente en el conjunto, puede almacenar el resultado completo de la inserción:
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.
}