我正在qt 5.12中尝试此代码:
//Definition of map
QMap<int, ZoneData*> mapId2Pointer_;
//Some values filled in mapId2Pointer_ here...
QMapIterator<int, ZoneData*> iteratorId2Pointer(mapId2Pointer_);
while (iteratorId2Pointer.hasNext())
{
iteratorId2Pointer.next();
if (iteratorId2Pointer.value() == _climbZoneData)
{
iteratorId2Pointer = mapId2Pointer_.erase(iteratorId2Pointer); //<- ERROR
}
}
但是,在最后一行的代码编译器中给出了此错误:
错误:呼叫" qmap :: erase(qmapiterator&amp;('无匹配函数' iteratorId2pointer = mapId2pointer_.erase(iteratorId2pointer(;
我看过很多例子,并且谷歌搜索了很多,但没有成功。所有示例看起来都与上面的示例相似,每个人都使用Qmapiterator作为qmap :: erase((调用中的参数。但是在我的代码中似乎可以从qmapiterator到qmap :: iterator的转换。
这个错误的原因是什么?
QMapIterator
是" java式迭代器", QMap::iterator
是" stl style迭代器"。他们不兼容;您需要使用一个或另一个。
您可以使用这样的QMap::iterator
迭代:
QMap<int, ZoneData*>::iterator i = mapId2Pointer_.begin();
while(i != mapId2Pointer_.end()) {
if (i.value() == _climbZoneData) {
i = mapId2Pointer_.erase(i);
} else {
++i;
}
}
请注意,如果您不在中间擦除事物(这使迭代器无效,要求您将其设置为从erase
中将其设置为返回值(,则可以将其用于循环。