[英]Why I cannot use Java-Style QMapIterator in QMap.erase()?
我在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&)'iteratorId2Pointer = mapId2Pointer_.erase(iteratorId2Pointer)的匹配函数;
我已经看过很多例子并且搜索过很多东西,没有成功。 所有示例都与上面的示例类似,每个示例都使用QMapIterator作为QMap :: erase()调用中的参数。 但是在我的代码中似乎没有从QMapIterator到QMap :: iterator的转换。
这个错误的原因是什么?
QMapIterator
是一个“Java风格的迭代器”, QMap::iterator
是一个“STL风格的迭代器”。 它们不兼容; 你需要使用其中一个。
您可以使用如下的QMap::iterator
:
QMap<int, ZoneData*>::iterator i = mapId2Pointer_.begin();
while(i != mapId2Pointer_.end()) {
if (i.value() == _climbZoneData) {
i = mapId2Pointer_.erase(i);
} else {
++i;
}
}
请注意,如果您没有删除中间的东西(使迭代器无效,要求您将其设置为erase
的返回值),则可以使用for循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.