Boost logo

Boost Users :

Subject: Re: [Boost-users] Correct use of unordered_map
From: Richard Hadsell (hadsell_at_[hidden])
Date: 2009-08-31 19:12:19


John Dlugosz wrote:
> Consider this loop:
>
> const my_map_t::iterator end= my_map.end();
> for (my_map_t::iterator it= my_map.begin(); it != end; ++it) {
> if (is_to_be_removed(it->first)) global_map.erase (it);
> }
>
> The documentation I've seen for unordered_map says that removing doesn't invalidate iterators except those referring to the element being deleted. But that's the case for it itself! Also, what does removing one element do to the ordering of the elements -- is there any guarantee that the iterator will visit exactly the ones that were not visited before?
>
> What is the correct, standards-conforming, way to perform this?
>
I use one of these 2 ways:

 for (my_map_t::iterator it= my_map.begin(); it != end; ) {
  if (is_to_be_removed(it->first))
   it = global_map.erase (it);
  else
   ++it;
 }

 for (my_map_t::iterator it= my_map.begin(); it != end; ) {
  my_map_t::iterator itx = it++;
  if (is_to_be_removed(itx->first))
   global_map.erase (itx);
 }

-- 
Dick Hadsell			203-992-6320  Fax: 203-992-6001
Reply-to:			hadsell_at_[hidden]
Blue Sky Studios                http://www.blueskystudios.com
1 American Lane, Greenwich, CT 06831-2560

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net