为什么我不能在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&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
中将其设置为返回值(,则可以将其用于循环。
相关文章:
- Qt VTK交互风格的信号到小部件
- 我可以使用条件运算符初始化C风格的字符串文字吗
- Visual Studio 2019:插入多个C++风格的单行注释
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++(Visual Studio)有Java风格的注释吗?
- 为什么我不能在qmap.erase()中使用Java风格的Qmapiterator
- 如何在Qt中使用java风格的迭代器而不是stl风格
- Java中数组的创建(C++风格)
- Java和C++的编码风格之间有什么具体的区别
- Java风格的静态常量初始化
- C++继承和受保护基类成员的访问:用Java风格做这件事是个坏主意吗