<div dir="rtl"><div dir="ltr">Hi Oliver,</div><div dir="ltr"><br></div><div dir="ltr">There would be no problem if both the Map and the Vector indeed contained (Key,Value) pairs.</div><div dir="ltr"><br></div><div dir="ltr">

To save space, Map entries do not contain Value but instead an unsigned index into the Vector:<br></div><div dir="ltr"><br></div><div dir="ltr"><div dir="ltr">/// The values are kept in a std::vector and the</div><div dir="ltr">

/// mapping is done with DenseMap from Keys to indexes in that vector.</div><div dir="ltr"><br></div></div><div dir="ltr">After an element is erased from the Vector all indices greater than the removed index are one too large.<br>

</div><div dir="ltr"><br></div><div dir="ltr">That's probably the reason why Mapvector did not have erase before. See</div><div dir="ltr"><br></div><div dir="ltr">  <a href="http://llvm.org/docs/ProgrammersManual.html#llvm-adt-mapvector-h">http://llvm.org/docs/ProgrammersManual.html#llvm-adt-mapvector-h</a><br>

</div><div dir="ltr"><br></div><div dir="ltr">...<span style="color:rgb(0,0,0);font-family:'Lucida Grande','Lucida Sans Unicode',Geneva,Verdana,sans-serif;font-size:14px;line-height:21px">and it doesn’t support removing elements.</span></div>

<div dir="ltr"><br></div><div dir="ltr">To correct this erase needs to decrement all vector indices in the Map which are larger than the removed index.</div><div dir="ltr"><br></div><div dir="ltr">Note that pop_back() does not have this problem as there are no indices following the last one.</div>

<div dir="ltr"><br></div><div dir="ltr">Yaron</div><div dir="ltr"><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote"><div dir="ltr">2014-07-15 17:35 GMT+03:00 Oliver Stannard <span dir="ltr"><<a href="mailto:oliver.stannard@arm.com" target="_blank">oliver.stannard@arm.com</a>></span>:</div>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-GB" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Do you have a reproducer for this problem? MapVector::erase removes the value from both the Vector and the Map, so it should not suffer from this problem. <u></u><u></u></span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Oliver<u></u><u></u></span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">

<div><div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm"><p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Yaron Keren [mailto:<a href="mailto:yaron.keren@gmail.com" target="_blank">yaron.keren@gmail.com</a>] <br>

<b>Sent:</b> 15 July 2014 15:18<br><b>To:</b> <a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a> Developers; <a href="mailto:llvmdev@cs.uiuc.edu" target="_blank">llvmdev@cs.uiuc.edu</a>; Oliver Stannard<br>

<b>Subject:</b> Re: Bug in MapVector::erase ?<u></u><u></u></span></p></div></div><div><div class="h5"><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">+llvmdev +Oliver. MapVector::erase was added in r211273.<u></u><u></u></p>

</div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">To avoid duplications, MapVector stores Values inside the vector only, while the map caches key->indices to the vector.<u></u><u></u></p>

</div><div><div><div><p class="MsoNormal"><br>When a value is erased from the MapVector, it is removed from the vector, invalidating the cached vector indices stored in the map, so the map points to wrong locations and the MapVector is corrupted.<br>

<span style="color:#888888">--<br>Yaron</span><u></u><u></u></p><div><div><p class="MsoNormal"><span style="color:#888888"><u></u> <u></u></span></p></div></div></div></div></div></div></div></div></div></div></div></blockquote>

</div><br></div>