Re: Erase in a map

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



On Mar 19, 1:43 pm, "freak" <farid.mehr...@xxxxxxxxx> wrote:
On Mar 16, 9:35 pm, Charles Zhang <CharlesZh...@xxxxxxxxxxxxxxxxx>
wrote:





I want to erase items in a map based on some criteria. However, as soon
as the erase is called, iterator become invalid. I would like someone
to tell me the better way to do it.

Here is the source code I am using, and it is crashing.

for ( pos = connectionMap.begin(); pos != connectionMap.end(); ++pos){
ConnectionInfo* conn = pos->second;

if ( current - conn->lastRequestTime > 60 * timeOut ) {
connectionMap.erase(pos);
}
}

To overcome the problem, I start the loop from the beginning after a
item is removed. But this is too slow.

Thanks

Charles Zhang

use standard library:
#include <algorithm>

/*assuming that TConnectionMap implements std::map<long,ConnectionInfo
*> */

typedef std::map<long,ConnectionInfo *> TConnectionMap;

struct ConnExpired{//define a predicate class;

ConnExpired(const long cur): current(cur) {};

bool operator () (const TConnectionMap::value_type& conn)
const
{
return current - conn.second->lastRequestTime > 60 *
timeOut ;
};

private:
const long current;

};

{//somewhere in the code:
TConnectionMap connectionMap;
long current;
std::remove_if
(connectionMap.begin(),connectionMap.end(),ConnExpired(current));

};

and do not worry about the validity of the iterators because the
STL(standard template library) is responsible for it.- Hide quoted text -

- Show quoted text -

PS:on my last post the 'std::remove_if' function returns a valid
iterator to the end of the range.

.



Relevant Pages

  • Re: const question
    ... >> I'd advice against that. ... My const function is to ... There the const iterator ... it seems to me that if a member function is returning a non-const ...
    (alt.comp.lang.learn.c-cpp)
  • Re: Erase in a map
    ... Charles Zhang wrote: ... as the erase is called, iterator become invalid. ...
    (microsoft.public.vc.stl)
  • Re: const question
    ... > I'd advice against that. ... > than simply removing 'const' everywhere. ... There the const iterator becomes problematic. ... The problem as I understand it is that a const function won't let me ...
    (alt.comp.lang.learn.c-cpp)
  • Re: Erase in a map
    ... pos = connectionMap.erase; ... as the erase is called, iterator become invalid. ...
    (microsoft.public.vc.stl)
  • Re: remove an item in a STL list
    ... the sequence becomes invalid. ... The iterator returned by erase() points to ... the returned iterator is invalid. ...
    (comp.lang.cpp)