Re: Erase in a map
- From: "freak" <farid.mehrabi@xxxxxxxxx>
- Date: 19 Mar 2007 02:43:21 -0700
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.
.
- Follow-Ups:
- Re: Erase in a map
- From: Igor Tandetnik
- Re: Erase in a map
- From: freak
- Re: Erase in a map
- References:
- Erase in a map
- From: Charles Zhang
- Erase in a map
- Prev by Date: Re: Erase in a map
- Next by Date: Re: Erase in a map
- Previous by thread: Re: Erase in a map
- Next by thread: Re: Erase in a map
- Index(es):
Relevant Pages
|
Loading