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
Foi útil?

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.
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top