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

If first and last in a map erase range are equal will the element be removed or not?

本文关键字:是否 删除 元素 最后一个 擦除 地图 范围内 第一个 如果      更新时间:2023-10-16

根据这个:

迭代器指定要删除的映射容器中的范围: [第一,最后(。即,范围包括第一个之间的所有元素 最后,包括第一个指向的元素,但不包括第一个指向的元素 最后指出。

这是模棱两可的,因为它没有解决第一个和最后一个相等的情况。如果第一个和最后一个相等,该元素是否会被删除?这是相关代码的表示形式:

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

如果第一个和最后一个相等,该元素是否会被删除?

当第一个和最后一个相等时,表示空白范围,不会擦除任何元素。std::vector::erase()文档说明:

如果 first==last,则迭代器首先不需要可取消引用:擦除空范围是无操作。

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