Я программирую симуляцию на основе агентов и решил, что MultiIndex Boost, вероятно, является наиболее эффективным контейнером для моих агентов. Я не профессиональный программист, и мой опыт очень плохой. У меня два вопроса:
- Лучше ли, чтобы в контейнере содержались агенты (класса
Host
), или для контейнера было бы более эффективно удерживать Host *
? Хосты иногда удаляются из памяти (в любом случае, это мой план ... нужно читать по new
и delete
). Частные переменные хостов будут периодически обновляться, что я надеюсь сделать через функцию modify
в MultiIndex. Других копий Хостов в симуляции не будет, т.е. они не будут использоваться ни в каких других контейнерах.
- Если я использую указатели на хосты, как правильно настроить извлечение ключей? Мой код ниже не компилируется.
// 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 (см. Сводную таблицу внизу) подразумевает, что я должен иметь возможность использовать функции-члены с элементами указателя.