Стирание и изменение элементов в Повышении Контейнер MultiIndex

Я пытаюсь использовать Повышение контейнер 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...
}

Мои вопросы

  1. В контейнере MultiIndex allHosts из shared_ptrs к Host объекты, звонит allHosts.erase( it ) на итераторе к shared_ptr объекта достаточно, чтобы удалить объект постоянно и освободить его из памяти? Это, кажется, удаляет shared_ptr из контейнера.
  2. allhosts контейнер в настоящее время имеет один функционирующий индекс, который полагается на идентификатор хоста. Если я представляю заказанный второй индекс, который обращается к функции членства (Хост:: getAge ()), где изменения возраста в течение моделирования, индекс всегда собирается быть обновленным, когда я обращаюсь к нему?
  3. Каково различие между использованием MultiIndex, изменяют для изменения возраста основного объекта по сравнению с подходом, который я показываю выше?
  4. Я неопределенно смущен тем, что принимается/требуется для константы в MultiIndex.

Заранее спасибо.


Обновление

Вот моя попытка добраться 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). Даже если некоторым чудом это оказывается правильным, я любил бы некоторое объяснение того, что продолжается.

7
задан Sarah 16 April 2010 в 18:00
поделиться

1 ответ

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
8
ответ дан 7 December 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: