Container.erase(container::end())

mi è capitato ormai qualche volta di vedere codice del tipo:

container.erase(find(element))

container è un qualsiasi tipo di container della STL che ha la funzione erase, tipo vector, find è o la funzione std::find o la funzione find del container. Il problema è che questa funzione può restituire anche un puntatore all’ultimo elemento del range di ricerca, in questo caso container::end(), cercando online non ho trovato niente che dicesse che fosse corretto e utilizzabile, infatti in ogni caso fare

container.erase(container::end())

è undefined behavior.
La mia domanda è: posso utilizzare questo tipo di scrittura nelle gare senza preoccuparmi del fatto che la funzione erase possa “rompere” tutto il programma?

Io solitamente eseguo un controllo prima di chiamare il metodo erase() così se l’iteratore restituito è end non faccio nulla e sono sicuro al 100%. Utilizzo quella scrittura solo quando sono sicuro di trovare sempre l’elemento cercato.

1 Mi Piace

Da https://en.cppreference.com/w/cpp/container/map/erase:

The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferenceable) cannot be used as a value for pos.

Direi decisamente che non si può passare il risultato di find ad erase, a meno che non ci sia qualche garanzia che l’elemento esiste sempre dovuta a come usi il container - o controllando che il risultato non sia T::end()

1 Mi Piace