É seguro para aumentar um iterador dentro quando usá-lo como um argumento?

StackOverflow https://stackoverflow.com/questions/161166

  •  03-07-2019
  •  | 
  •  

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 ();

Foi útil?

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