Boost logo

Boost Users :

Subject: Re: [Boost-users] [multi_index] doing insert() within iteration over equal_range() result?
From: Prometheus Prometheus (prometheus__0_at_[hidden])
Date: 2008-10-27 03:28:06

> Date: Thu, 23 Oct 2008 16:50:15 +0200
> From: joaquin_at_[hidden]
> To: boost-users_at_[hidden]
> Subject: Re: [Boost-users] [multi_index] doing insert() within iteration over equal_range() result?
> Prometheus Prometheus escribió:
>> Hi all,
>> i have the following problem:
>> i use multi_index like this
>> std::pair range;
>> range = this->events.get().equal_range(boost::make_tuple(event,condition));
>> while(range.first!=range.second){
>> // CALL an event handler!
>> this->callEventHandler(range.first); // << this shows just how it works, its not exactly my code
>> ++range.first;
>> }
>> within the callEventHandler and its called functions its possible that the event handler wants to register new events which results to this:
>> this->events.insert(eventdata);
>> The problem is OR can be, that the insert modifies the indices which modify the range.first iterators and thus a ++range.first results in an invalid "next" element
>> this makes sense and i think most of you know this and had this problem already
>> Questions:
>> Does anyone have a good idea/solution how to solve this situation correctly so that the range i received will be valid?
> I think the easiest solution is to save copies of the iterators in range
> before you
> start the loop:
> range = this->events.get().equal_range(boost::make_tuple(event,condition));
> std::vector buff;
> while(range.first!=range.second)buff.push_back(range.first++);
> for(std::size_t n=0,s=buff.size();n // CALL an event handler!
> this->callEventHandler(buff[n]);
> }
> HTH,
> Joaquín M López Muñoz
> Telefónica, Investigación y Desarrollo

hmm, great and easy solution, thx!
but just to get better knowledge of (boost) iterators
1. what distinguishes 2 iterators of the same type?
to ask it differently: given are 2 multi_index objects storing the same information
2. find() using the same search values will give me results on both objects - can i store the iterators in a vector OR a std::set without a problem? or will there be conflicts between the iterators, cause they are pointing to the same datatype?
3. is obj1.end()==obj2.end() true?

thx @ ll
Discover the new Windows Vista

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at