Я пытаюсь использовать Повышение контейнер MultiIndex на моем моделировании. Мое знание синтаксиса C++ очень слабо, и я обеспокоен, что правильно не удаляю элемент из контейнера или удаляю его из памяти. Я также должен изменить элементы, и я надеялся подтвердить синтаксис и базовую философию здесь также.
// main.cpp
...
#include
#include
#include
#include
#include
#include
#include
...
#include "Host.h" // class Host, all members private, using get fxns to access
using boost::multi_index_container;
using namespace boost::multi_index;
typedef multi_index_container<
boost::shared_ptr< Host >,
indexed_by<
hashed_unique< const_mem_fun >
// ordered_non_unique< BOOST_MULTI_INDEX_MEM_FUN(Host,int,&Host::getAge) >
> // end indexed_by
> HostContainer;
typedef HostContainer::nth_index<0>::type HostsByID;
int main() {
...
HostContainer allHosts;
Host * newHostPtr;
newHostPtr = new Host( t, DOB, idCtr, 0, currentEvents );
allHosts.insert( boost::shared_ptr(newHostPtr) );
// allHosts gets filled up
int randomHostID = 4;
int newAge = 50;
modifyHost( randomHostID, allHosts, newAge );
killHost( randomHostID, allHosts );
}
void killHost( int id, HostContainer & hmap ){
HostsByID::iterator it = hmap.find( id );
cout << "Found host id " << (*it)->getID() << "Attempting to kill. hmap.size() before is " << hmap.size() << " and ";
hmap.erase( it ); // Is this really erasing (freeing from mem) the underlying Host object?
cout << hmap.size() << " after." << endl;
}
void modifyHost( int id, HostContainer & hmap, int newAge ){
HostsByID::iterator it = hmap.find( id );
(*it) -> setAge( newAge ); // Not actually the "modify" function for MultiIndex...
}
Мои вопросы
allHosts
из shared_ptrs к Host
объекты, звонит allHosts.erase( it )
на итераторе к shared_ptr объекта достаточно, чтобы удалить объект постоянно и освободить его из памяти? Это, кажется, удаляет shared_ptr из контейнера.allhosts
контейнер в настоящее время имеет один функционирующий индекс, который полагается на идентификатор хоста. Если я представляю заказанный второй индекс, который обращается к функции членства (Хост:: getAge ()), где изменения возраста в течение моделирования, индекс всегда собирается быть обновленным, когда я обращаюсь к нему?Заранее спасибо.
Обновление
Вот моя попытка добраться modify
работа синтаксиса, на основе того, что я вижу в связанном примере Повышения.
struct update_age {
update_age():(){} // have no idea what this really does... elicits error
void operator() (boost::shared_ptr ptr) {
ptr->incrementAge(); // incrementAge() is a member function of class Host
}
};
и затем в modifyHost
, Я имел бы hmap.modify(it,update_age)
. Даже если некоторым чудом это оказывается правильным, я любил бы некоторое объяснение того, что продолжается.
shared_ptr
удалит фактический объект Host
в своем деструкторе (если нет других экземпляров shared_ptr
). Все объекты в MultiIndex считаются постоянными. Чтобы изменить объект, вы должны использовать метод modify
из MultiIndex. В этом случае при необходимости индексы будут обновлены.
Вы можете использовать следующий функтор для изменения поля age
:
struct change_age
{
change_age(int age) : age_(age) {}
void operator()(boost::shared_ptr<Host> h) // shared_ptr !!!
{
h->age = age_;
}
private:
int age_;
};
Затем используйте его следующим образом:
testHosts.modify( it, Host::change_age( 22 ) ); // set age to 22