gpt4 book ai didi

c++ - 在 Boost MultiIndex 容器中移动 equal_range 时迭代器失败

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:38 25 4
gpt4 key购买 nike

我的迭代器出错了,但我还看不到。

我有一个 Boost MultiIndex 容器,HostContainer hmap,它的元素是 boost::shared_ptr 到类 Host 的成员。所有索引都作用于 Host 类的成员函数。第三个索引是 Host::getHousehold(),其中 household 成员变量是一个 int

下面,我尝试遍历与特定家庭匹配的主机范围 (int hhold2),并将相应的私有(private)成员变量 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 > 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 的家庭中。非常欢迎任何见解。

最佳答案

int numFamily = hmap.get<2>().count( hhold2 );
int familyIDs[ numFamily ];

这怎么可能行得通?这甚至不应该编译:你不能定义一个元素数量可变的数组,numFamily 必须是一个编译时常量,否则你必须定义 familyIDs作为

int *familyIDs= new int[ numFamily ];

关于c++ - 在 Boost MultiIndex 容器中移动 equal_range 时迭代器失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2693580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com