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

jac*_*nad 2 c++ dictionary range erase

根据这个:

迭代器指定要删除的地图容器内的范围:[first,last)。即范围包括 first 和 last 之间的所有元素,包括 first 指向的元素但不包括 last 指向的元素。

这是模棱两可的,因为它没有解决 first 和 last 相等的情况。如果 first 和 last 相等,元素是否会被删除?这是相关代码的表示:

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);
Run Code Online (Sandbox Code Playgroud)

Sla*_*ica 5

如果 first 和 last 相等,元素是否会被删除?

当 first 和 last 相等时表示空范围并且不会擦除任何元素。它是针对std::vector::erase() 文档说明的:

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

for 的语义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);
Run Code Online (Sandbox Code Playgroud)

代码意味着 - 从开始到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));
Run Code Online (Sandbox Code Playgroud)