2008-10-21 15 views
7

Estoy tratando de usar set.insert (key) como un condicional, donde si la clave se inserta correctamente (lo que significa que la clave NO existe ya en el conjunto) entonces debería continuar y realizar algún tipo de código. Por ejemplo, algo como:Usando set.insert (key) como condicional?

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

¿Esto está permitido? Debido a que el compilador está lanzando este error:

conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal 
+0

Creo que estás diciendo mentiras. En primer lugar, se estaría quejando por 'falta'). ;-) –

Respuesta

13

La versión de inserción que tiene un único valor de la clave debe devolver un std::pair<iterator,bool>, donde el bool indica si se realizó una inserción. Un valor de verdadero indica que el valor fue insertado, y falso indica que el valor ya estaba presente. Por lo que su condición se vería así:

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

set :: inserción devuelve un par, intente esto:

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

Otras respuestas han sugerido usar sólo '.SECOND', siendo este punto - pero si el procesamiento que es necesario realizar utiliza la entrada existente en el conjunto, entonces 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. 
}