$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: joaquin_at_[hidden]
Date: 2008-06-12 13:09:09
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;
  }
}