Я делаю ошибку с моими итераторами, но пока не вижу.
У меня есть контейнер 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. Любое понимание было бы очень желательно.