繁体   English   中英

为什么我不能在QMap.erase()中使用Java风格的QMapIterator?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM