metodos example c++ c++11 iterator stdmap const-iterator

example - metodos map c++



¿Por qué const_iterator podría usarse con std:: map:: erase (2)

El comportamiento ha cambiado de C ++ 11; std::map::erase toma const_iterator como su parámetro.

void erase( iterator pos ); // (until C++11) iterator erase( const_iterator pos ); // (since C++11) iterator erase( iterator pos ); // (since C++17)

Para std::map::erase , el iterador pasado solo se usa como la posición donde se eliminaría el elemento, no para modificarlo a través de él. Eso significa que const_iterator estaría bien. Antes de C ++ 11, el soporte para const_iterator no era muy bueno, pero la situación ha cambiado de C ++ 11. Debe usar const_iterator lugar de iterator cuando sea posible ahora.

Tenía la impresión de que no se puede usar el erase en un const iterator . Revisa este código .
¿Por qué se compila el siguiente código (C ++ 11, gcc)?

long getMax(const bool get_new) { long max_val=0; TO now=getNow(); map<TO, long>& m=get_new?m_new:m_old; for(auto it=m.cbegin(); it !=m.cend()) { if(now.compareTime((*it).first)<lookback) { max_val=max(max_val, (*it).second); ++it; } else { it=m.erase(it); } } return max_val; }

El map sí no es constante, pero mi entendimiento es que el const iterator debe hacer que esto falle.


Las posiciones son independientes de la constancia de su acceso. Era (¿es?) Bastante común que las funciones que realizan una búsqueda devuelvan const_iterator porque en realidad no cambian el contenedor en absoluto. Sin embargo, es deseable usar la posición obtenida para las mutaciones de las secuencias, por ejemplo, para insert() un elemento en la posición correspondiente o para erase() el elemento localizado. Como resultado, el contenedor se extendió para admitir el uso de const_iterator con operaciones de mutación.

Parece que el papel relevante es N2350 . No estoy seguro si este papel es la última versión.