Синтаксис составного ключа в Boost MultiIndex - PullRequest
5 голосов
/ 19 апреля 2010

Даже после изучения примеров у меня возникают проблемы с выяснением, как извлечь диапазоны с помощью составного ключа в контейнере MultiIndex.

typedef multi_index_container<
  boost::shared_ptr< Host >,
  indexed_by< 
    hashed_unique< const_mem_fun<Host,int,&Host::getID> >, // ID index
    ordered_non_unique< const_mem_fun<Host,int,&Host::getAgeInY> >, // Age index
    ordered_non_unique< const_mem_fun<Host,int,&Host::getHousehold> >, // Household index
    ordered_non_unique< // Age & eligibility status index
      composite_key<
         Host,
        const_mem_fun<Host,int,&Host::getAgeInY>,
        const_mem_fun<Host,bool,&Host::isPaired>
        >
       >
    > // end indexed_by
  > HostContainer;

Моя цель - получить итератор, указывающий на первый из подмножества элементов в HostContainer hmap, который имеет возраст partnerAge и возвращает false в Host::isPaired():

  std::pair< hmap::iterator,hmap::iterator > pit = hmap.equal_range(boost::make_tuple( partnerAge, false ) );

Я думаю, что это очень неправильно.

  1. Как / Где мне указать индекс итератора (который должен быть равен 3 для возраста и права)?Я включу другие составные ключи в будущем.
  2. Что именно представляют собой два итератора в std::pair?(Я копирую синтаксис из примера, который я не понимаю.)
  3. В идеале я бы использовал std::count, чтобы вычислить число элементов возраста partnerAge, которые имеют право (верните false в Host::isPaired()).Каков синтаксис для извлечения отсортированного индекса, который отвечает этим требованиям?

Я, очевидно, все еще изучаю синтаксис C ++.Заранее спасибо за любую помощь.

1 Ответ

4 голосов
/ 19 апреля 2010

Чтобы получить доступ к N-му индексу, вы можете использовать функцию get следующим образом:

std::pair< hmap::nth_index<3>::type::const_iterator,
           hmap::nth_index<3>::type::const_iterator > pit = 
  hmap.get<3>().equal_range(boost::make_tuple( partnerAge, false ) );

equal_range возвращает пару итераторов N-го индекса. Вы получите диапазон элементов, которые удовлетворяют указанному условию, поскольку ваш составной ключ не является уникальным. Чтобы перебрать этот диапазон, вы можете использовать цикл от первого итератора до второго.

Подумайте об использовании именованных индексов, чтобы использовать их как get<index_name>(), поскольку указание действительного числа не очень читабельно.

count имеет синтаксис, аналогичный equal_range:

size_t cnt = hmap.get<3>().count(boost::make_tuple( partnerAge, false ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...