> Date: Thu, 23 Oct 2008 16:50:15 +0200 > From: joaquin@tid.es > To: boost-users@lists.boost.org > 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 Learn more!