É seguro para aumentar um iterador dentro quando usá-lo como um argumento?
Pergunta
Atualmente estou tentando apagar uma sequência de iteradores de um conjunto, no entanto biblioteca padrão do GCC parece estar quebrado porque std :: set :: erase (iterator) deve retornar a um iterador (próxima iteração), no entanto, no GCC ele retorna void (que é padrão?)
De qualquer forma eu quero escrever:
myIter = mySet.erase(myIter);
Mas GCC não gosta ... Então, é seguro para escrever este em vez disso?
mySet.erase(myIter++);
Edit: E sim, eu estou verificando contra mySet.end ();
Solução
Não há nenhum problema com
mySet.erase(myIter++);
A ordem de operação é bem definida:. MyIter é copiado para myTempIter, myIter é incrementado, e myTempIter é então dado ao método de apagamento
Para Greg e Mark : não, não há nenhum operador maneira ++ pode executar operações após a chamada para apagar. Por definição, apagar () é chamado após operador ++ voltou.
Outras dicas
Em primeiro lugar, reler o padrão e você verá que o protótipo do método set :: erase é:
void erase(iterator position);
No entanto, os recipientes associativos na STL são "estável", tal como apagar um elemento não afectam as iterators sobre os outros elementos. Isto significa que a seguinte linha é válido:
iterator to_erase = myIter++;
mySet.erase(to_erase);
// Now myIter is still on the next element