Consider the canonical algorithm for removing an element from an associative container while iterating:
for (auto iter = myMap.begin(); iter != myMap.end(); )
{
if (/* removal condition */)
{
iter = myMap.erase(iter);
}
else
{
++iter;
}
}
I've been applying this algorithm without a second thought when using the C++11 std::unordered_map
container. However, after browsing the documentation for std::unordered_map::erase
on cppreference.com, I became a little concerned after reading the following note:
The order of the elements that are not erased is preserved (this makes it possible to erase individual elements while iterating through the container) (since C++14)
Based on this statement, I'm assuming there was language added to the C++14 standard to ensure library implementers guarantee ordering after a call to std::unordered_map::erase
. For example, maybe such a requirement constrains the implementation from not rehashing the entire container after an element is removed, but rather only allows it to remove the element from its corresponding bucket?
Without such a guarantee in C++11, and if I desire my code to be portable, do I have to worry that some elements will be visited multiple times or not at all if I remove an element from an std::unordered_map
during iteration?
Edit: The dangers of NoScript. I had noscript running, which displayed the C11 and C14 tabs as one box. Praetorian's answer is correct about it being guaranteed in practice, and formalized in c14.
** Below is wrong due to noscript.
At the bottom of cplusplus it states that
http://www.cplusplus.com/reference/unordered_map/unordered_map/erase/
At the top of the page, it states it's for C++11...so unless they updated it for C++14, i think it applies to C++11 as well. Praetorian should put an answer and you should check his for the answer, because even if it's not guaranteed in the standard for C++11 (C++14 being the patch for these sort of things), it's guaranteed in practice.
I couldn't find the STL standard, I seem to have misplaced it, or I'd go see if there was a text guaranteed I could point to. :-/