[boost-users][multi-index] iterating though index keys
Hi, I'm trying to replace few data structures and types defined in my application in terms of std containers, with the mutli_index_container. Some of those types look like this: struct Entry { int someForeignKey; int data1; std::string data2; //.... }; typedef std::deque<Entry> Entries; typedef std::map<int, Entries> EntriesByForeignKey; I'd like to rewrite the above map as follows: typedef mi::multi_index_container < Entry, mi::indexed_by < mi::hashed_non_unique<mi::tag<foreignKey>, mi::member<Entry, int, &Entry::someForeignKey> >
Entries;
typedef Entries::index<foreignKey>::type EntriesByForeignKey; Now, I'd like to iterate through the *keys* of this index, and for each key - iterate through all its values. IIUC, the second part can be accomplished like this: { Entries entries; EntriesByForeignKey::iterator begin = entries.get<foreignKey>().find(theKey), end = entries.get<foreignKey>().end(); for_each (begin, end, ....); } ...but how can I iterate through all the keys of this index? Or should I define another index for this purpose (sequenced one?) ? Thank you, Igor'.
Igor R escribió:
Hi,
I'm trying to replace few data structures and types defined in my application in terms of std containers, with the mutli_index_container. Some of those types look like this:
struct Entry { int someForeignKey; int data1; std::string data2; //.... }; typedef std::deque<Entry> Entries; typedef std::map<int, Entries> EntriesByForeignKey;
I'd like to rewrite the above map as follows:
typedef mi::multi_index_container < Entry, mi::indexed_by < mi::hashed_non_unique<mi::tag<foreignKey>, mi::member<Entry, int, &Entry::someForeignKey> >
Entries;
typedef Entries::index<foreignKey>::type EntriesByForeignKey;
Now, I'd like to iterate through the *keys* of this index, and for each key - iterate through all its values.[...]
Hi Igor, if I'm understanding your request correctly I think you can do that like this: for(Entries::iterator it_key=entries.begin(),end=entries.end();it_key!=end;){ // get all elements with key it_key->someForeignKey std::pair<Entries::iterator,Entries::iterator> values= entries.equal_range(it_key->someForeignKey); while(values.first!=values.second){ // process element ++values.first; } // next key is just that of the element right after the current value group it_key=values.second; } Is this what you were after? Please find attached a small program exercising this idea. HTH, Joaquín M López Muñoz Telefónica, Investigación y Desarrollo #include <boost/multi_index_container.hpp> #include <boost/multi_index/hashed_index.hpp> #include <boost/multi_index/member.hpp> #include <iostream> #include <string> struct Entry { int someForeignKey; int data1; std::string data2; Entry(int someForeignKey,int data1,const std::string& data2): someForeignKey(someForeignKey),data1(data1),data2(data2) {} }; namespace mi=boost::multi_index; struct foreignKey; typedef mi::multi_index_container < Entry, mi::indexed_by < mi::hashed_non_unique < mi::tag<foreignKey>, mi::member<Entry, int,&Entry::someForeignKey> >
Entries;
typedef Entries::index<foreignKey>::type EntriesByForeignKey; int main() { Entries entries; entries.insert(Entry(0,1,"hello")); entries.insert(Entry(0,2,"bye")); entries.insert(Entry(0,3,"boost")); entries.insert(Entry(1,4,"multi_index")); entries.insert(Entry(1,5,"igor")); entries.insert(Entry(2,6,"container")); for(Entries::iterator it_key=entries.begin(),end=entries.end();it_key!=end;){ std::cout<<"key: "<<it_key->someForeignKey<<"\n"; std::pair<Entries::iterator,Entries::iterator> values= entries.equal_range(it_key->someForeignKey); while(values.first!=values.second){ std::cout<<" ("<<values.first->data1<<","<<values.first->data2<<")\n"; ++values.first; } it_key=values.second; } }
participants (2)
-
Igor R
-
joaquin@tid.es