为什么我不能在qmap.erase()中使用Java风格的Qmapiterator

Why I cannot use Java-Style QMapIterator in QMap.erase()?

本文关键字:Java 风格 Qmapiterator 不能 qmap erase 为什么      更新时间:2023-10-16

我正在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中将其设置为返回值(,则可以将其用于循环。