Boost MultiIndex - объекты или указатели (и как их использовать?)? - PullRequest
7 голосов
/ 15 апреля 2010

Я программирую симуляцию на основе агентов и решил, что MultiIndex Boost, вероятно, является наиболее эффективным контейнером для моих агентов. Я не профессиональный программист, и мой опыт очень плохой. У меня два вопроса:

  1. Лучше ли, чтобы в контейнере содержались агенты (класса Host), или для контейнера было бы более эффективно удерживать Host *? Хосты иногда удаляются из памяти (в любом случае, это мой план ... нужно читать по new и delete). Частные переменные хостов будут периодически обновляться, что я надеюсь сделать через функцию modify в MultiIndex. Других копий Хостов в симуляции не будет, т.е. они не будут использоваться ни в каких других контейнерах.
  2. Если я использую указатели на хосты, как правильно настроить извлечение ключей? Мой код ниже не компилируется.
// main.cpp - ATTEMPTED POINTER VERSION
...
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/tokenizer.hpp>

typedef multi_index_container<
  Host *,
  indexed_by< 
    // hash by Host::id
    hashed_unique< BOOST_MULTI_INDEX_MEM_FUN(Host,int,Host::getID) > // arg errors here
    > // end indexed_by
  > HostContainer;

...
int main() {

   ...
   HostContainer testHosts;
   Host * newHostPtr;
   newHostPtr = new Host( t, DOB, idCtr, 0, currentEvents );
   testHosts.insert( newHostPtr );
   ... 
}

Я не могу найти точно аналогичный пример в документации Boost, и мои знания синтаксиса C ++ все еще очень слабы. Код действительно работает, когда я заменяю все ссылки на указатели на сами объекты класса.


Как я могу прочитать, документация Boost (см. Сводную таблицу внизу) подразумевает, что я должен иметь возможность использовать функции-члены с элементами указателя.

1 Ответ

10 голосов
/ 15 апреля 2010

Если Host содержит много данных, вы можете использовать shared_ptr, чтобы избежать копирования. Вы можете использовать MultiIndex с shared_ptr в нем:

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/shared_ptr.hpp>

using namespace boost::multi_index;

struct Host
{
   int get_id() const { return id; }
 private:
   int id;
   // more members here
};

typedef multi_index_container<
  boost::shared_ptr<Host>,    // use pointer instead of real Host
  indexed_by< 
    // hash using function Host::get_id
    hashed_unique< const_mem_fun<Host, int, &Host::get_id> >
    > // end indexed_by
  > HostContainer;

Тогда вы можете использовать его следующим образом:

int main()
{
   HostContainer testHosts;
   Host * newHostPtr;
   newHostPtr = new Host;
   testHosts.insert( boost::shared_ptr<Host>(newHostPtr) );

  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...