根据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);
答案 0 :(得分:4)
如果第一个和最后一个相等,那么元素是否会被移除?
当first和last相等时表示空范围,并且不会删除任何元素。适用于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));