Usando set.insert (key) como uma condicional?
-
03-07-2019 - |
Pergunta
Eu estou tentando usar set.insert (key)
como uma condicional, onde se a chave está inserida corretamente (o que significa que a chave ainda não existir no conjunto), então ele deve continuar e realizar algum tipo de código. Por exemplo, algo como:
if (set.insert( key )) {
// some kind of code
}
Isso é permitido? Porque o compilador está jogando este erro:
conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal
Solução
A versão de inserção que recebe um único valor de chave deve retornar um std::pair<iterator,bool>
, onde o bool indica se uma inserção foi feita. Um valor verdadeiro indica que o valor foi inserido, e falso que indica o valor já estava presente. Portanto, sua condicional ficaria assim:
if( set.insert( key ).second ) {
// code
}
Outras dicas
set :: insert retorna um par, tente o seguinte:
if( set.insert( key ).second ) {
// some kind of code
}
Outras respostas sugeriram apenas usando '.segunda', e isso vai funcionar - mas se o processamento que você precisa para realizar usos a entrada existente no conjunto, então você pode armazenar o resultado completo da inserção:
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.
}