2017-02-09 1 views
1

Selon this:Si le premier et le dernier d'une plage d'effacement de carte sont égaux, l'élément sera-t-il supprimé ou non?

itérateurs spécifiant une plage dans le conteneur de carte à enlever: [premier, dernier). c'est-à-dire que la gamme comprend tous les éléments entre le premier et le dernier, y compris l'élément pointé en premier mais pas celui pointé par le dernier.

Ceci est ambigu car il n'aborde pas le cas où le premier et le dernier sont égaux. Si premier et dernier sont égaux, l'élément sera-t-il supprimé ou non? Ceci est une représentation du code en question:

map<uint16_t, boost::shared_ptr<SPacket> >::iterator it = m_MyMap.find(ack); 
if (it != m_MyMap.end()) m_MyMap.erase(m_MyMap.begin(), it); 

Répondre

3

Si le premier et le dernier sont égaux sera l'élément être retiré ou non?

Lorsque le premier et le dernier sont égaux, ils représentent une plage vide et aucun élément ne sera effacé. Il est indiqué pour std::vector::erase()documentation:

Le premier itérateur n'a pas besoin d'être dereferenceable si le premier == dernier: effacer une plage vide est un no-op.

sémantique pour std::map::erase() doit être identique.

map<uint16_t, boost::shared_ptr<SPacket> >::iterator it = m_MyMap.find(ack); 
if (it != m_MyMap.end()) m_MyMap.erase(m_MyMap.begin(), it); 

Code signifie - tout effacer du début à it mais à l'exclusion it. si it est égal à m_MyMap.begin() rien ne sera effacé.

Si vous souhaitez inclure l'élément avec la même clé de ack dont vous avez besoin pour faire avancer it:

map<uint16_t, boost::shared_ptr<SPacket> >::iterator it = m_MyMap.find(ack); 
if (it != m_MyMap.end()) m_MyMap.erase(m_MyMap.begin(), std::next(it));