我在学校项目中遇到了一个问题:我需要一组映射到键号的数字。 ZZ
是来自NTL库的大整数类,但这并不重要。我的程序总是在内循环上失败,并显示it_set2
无法迭代的消息。
std::map<ZZ, std::set<ZZ>> mapa;
std::map<ZZ, std::set<ZZ>>::iterator it_map;
std::set<ZZ>::iterator it_set1, it_set2;
for (it_map = mapa.begin(); it_map != mapa.end(); ++it_map) {
for (it_set1 = it_map->second.begin(); it_set1 != it_map->second.end(); ++it_set1) {
for (it_set2 = ++it_set1; it_set2 != it_map->second.end(); ++it_set2) {
/*
some function that uses *it_set1, *it_set2
*/
}
}
}
感谢您的帮助。
答案 0 :(得分:1)
我认为问题出现在最内循环中。如果您希望it_set2
指向it_set1
当前指向的下一个元素(但实际上没有递增it_set1
),那么您应该将第三个循环更改为以下内容:{{1} }。
这将确保您不会超出界限,并且在没有必要时不会递增for(it_set2 = it_set1; ++it_set2 != it_map->second.end(); )
。
答案 1 :(得分:0)
根据您提供的信息,我怀疑您在第二个循环中遇到最后一个set-element时会遇到问题。迭代完最后一个循环后,第三个循环递增it_set1
,然后是end
迭代器(当你查看最后一个元素时)。第三个for循环终止,第二个循环执行其past-body指令,++it_set1
移动迭代器超过end
,从而调用未定义的行为。