2017-02-09 2 views
1

マップコンテナ内の範囲を特定マップの消去範囲の最初と最後が等しい場合、要素は削除されますか? <a href="http://www.cplusplus.com/reference/map/map/erase/" rel="nofollow noreferrer">this</a>によれば

イテレータを削除する: [最初、最後)。すなわち、範囲は最初に と最後の間にあるすべての要素を含みますが、最初に指し示された要素を含みますが、最後に指された要素は含まれません 。

これは、最初と最後が等しい場合に対処しないため、あいまいです。最初と最後が等しい場合、要素は削除されるかどうか?これは、問題のコードを表現したものです:

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のために記載されている:

最初==最後の場合、イテレータは最初dereferenceableである必要はありません:空の範囲を消去することは何もしません。

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を除くからすべてを消去します。 itm_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)); 
関連する問題