问题
I am using boost::unordered_map
as follows
typedef boost::shared_ptr<WriterExeciter> PtrWriter;
typedef std::list<PtrWriter> PtrList;
boost::unordered_map<std::pair<unsigned int, unsigned long long>, PtrList> Map
Map instrMap;
Now I am making some changes to the list of type PtrList
in a loop
for(auto it = instrMap.begin(); it != instrMap.end(); ++it)
{
auto key = it->first();
auto list& = it->second();
//Make some change to an element in list
if(list.empty())
{
instMap.erase(key);
}
}
Does making changes to the list invalidate the iterator to instrMap?
Erasing the element will invalidate the iterator pointing to the erased element. How do I modify my code so that the this does not cause any problem? Does using
it++
instead of++it
help?
Thanks
回答1:
The erase()
operation will invalidate the iterator. However, it also returns a valid iterator to the next element. So you can use something like the following:
for(auto it = instrMap.begin(); it != instrMap.end();)
{
auto key = it->first();
auto list& = it->second();
//Make some change to an element in list
if(list.empty())
{
it = instMap.erase(it);
}
else {
++it;
}
}
来源:https://stackoverflow.com/questions/11443405/iterator-invalidation-in-boostunordered-map