我在迭代器上犯了一些错误,但我还没有看到它。
我有一个Boost MultiIndex容器HostContainer hmap
,其元素为boost::shared_ptr
个类Host
的成员。所有索引都适用于类Host的成员函数。第三个索引是Host::getHousehold()
,其中household
成员变量是int
。
下面,我试图迭代匹配特定家庭(int hhold2
)的主机范围,并将相应的私有成员变量Host::id
加载到数组中。当家庭大小为2时,我收到“断言失败:(px!= 0),函数运算符 - >;文件/Applications/boost_1_42_0/boost/smart_ptr/shared_ptr.hpp,第418行”错误。我还不知道是否在家庭人数为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&gt;运行时运行。 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号家庭。任何见解都会非常受欢迎。
答案 0 :(得分:1)
int numFamily = hmap.get<2>().count( hhold2 );
int familyIDs[ numFamily ];
这怎么可能有效?这甚至不应该编译:您不能定义具有可变数量元素的数组,numFamily
必须是编译时常量,否则您必须将familyIDs
定义为
int *familyIDs= new int[ numFamily ];