$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
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
http://search.msn.com/results.aspx?q=windows+vista&mkt=en-US&form=QBRE