2017-02-09 18 views
1

В соответствии с this:Если первый и последний в диапазоне стирания карты равны, элемент будет удален или нет?

итераторы, определяющие диапазон, в пределах контейнера карты должны быть удалены: [первый, последний). то есть диапазон включает в себя все элементы между первым и последним, включая элемент, обозначенный первым, но не тот, который указан последним.

Это неоднозначно, так как оно не относится к случаю, когда первый и последний равны. Если первый и последний равны, элемент будет удален или нет? Это представление кода в вопросе:

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

ответ

3

Если первые и последние, равно будет удален элемент или нет?

Когда первый и последний равны, которые представляют пустой диапазон, и никакие элементы не будут удалены. Указываются для std::vector::erase()documentation:

Итератору первый не должен быть разыменовываемыми, если первый == последний: удаление пустого диапазона является не оп.

семантика для std::map::erase() должна быть одинаковой.

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

код означает - стереть все, от начала до it, но исключая it. если it равно m_MyMap.begin() ничего не будет стерто.

Если вы хотите включить элемент с ключом, равным ack вам нужно заранее 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));