如果地图中的第一个和最后一个擦除范围相等,是否会删除该元素?

时间:2017-02-09 14:56:39

标签: c++ dictionary range erase

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

1 个答案:

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