Ошибка итератора при перемещении по equal_range в контейнере Boost MultiIndex - PullRequest
1 голос
/ 22 апреля 2010

Я делаю ошибку с моими итераторами, но пока не вижу.

У меня есть контейнер Boost MultiIndex, HostContainer hmap, элементы которого boost::shared_ptr для членов класса Host. Все индексы работают над функциями-членами класса Host. Третий индекс - Host::getHousehold(), где переменная-член household является int.

Ниже я пытаюсь выполнить итерацию по диапазону хостов, соответствующих определенному домохозяйству (int hhold2), и загрузить соответствующую приватную переменную-член Host::id в массив. Я получаю сообщение об ошибке «Утверждение не удалось: (px! = 0), оператор функции->, файл /Applications/boost_1_42_0/boost/smart_ptr/shared_ptr.hpp, строка 418» во время выполнения, когда размер домашнего хозяйства равен 2. (I пока не могу сказать, происходит ли это в любое время, когда размер домохозяйства равен 2, или же должны быть выполнены другие условия.)

typedef multi_index_container<
  boost::shared_ptr< Host >,
  indexed_by< 
    hashed_unique< const_mem_fun<Host,int,&Host::getID> >, // 0 - ID index
    ordered_non_unique< const_mem_fun<Host,int,&Host::getAgeInY> >, // 1 - Age index
    ordered_non_unique< const_mem_fun<Host,int,&Host::getHousehold> > // 2 - Household index
    > // end indexed_by
  > HostContainer; 

typedef HostContainer::nth_index<2>::type HostsByHH;

// inside main()
int numFamily = hmap.get<2>().count( hhold2 );
int familyIDs[ numFamily ];
for ( int f = 0; f < numFamily; f++ ) {
  familyIDs[ f ] = 0;
}
int indID = 0;
int f = 0;
std::pair< HostsByHH::iterator, HostsByHH::iterator > pit = hmap.get<2>().equal_range( hhold2 );
cout << "\tNeed to update households of " << numFamily << " family members (including self) of host ID " << hid2 << endl;
while ( pit.first != pit.second ) {
   cout << "Pointing at new family member still in hhold " << (*(pit.first))->getHousehold() << "; " ;
  indID = (*(pit.first) )->getID();
  familyIDs[ f ] = indID;
  pit.first++;
  f++;
} 

Что может сделать этот код неудачным? Приведенный выше фрагмент кода запускается только при numFamily> 1. (Другие предложения и критические замечания также приветствуются.) Заранее благодарим.


Я заменил цикл while () на

for ( HostsByHH::iterator fit = pit.first; fit != pit.second; fit++ ) {
  cout << "Pointing at new family member still in hhold " << (*fit)->getHousehold() << "; " ;
  indID = (*fit )->getID();
  cout << "id=" << indID << endl;
  familyIDs[ f ] = indID;
  f++;
} 

Кажется, это работает.

Я не совсем понимаю, как это исправить или почему ранее произошла ошибка только с домохозяйствами размера 2. Любое понимание было бы очень желательно.

1 Ответ

1 голос
/ 26 апреля 2010
int numFamily = hmap.get<2>().count( hhold2 );
int familyIDs[ numFamily ];

Как это может работать? Это даже не должно компилироваться: вы не можете определить массив с переменным числом элементов, numFamily должен быть константой времени компиляции, иначе вы должны определить familyIDs как

int *familyIDs= new int[ numFamily ];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...