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
¿Fue útil?

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.
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top