c++ - 在 C++ 中擦除后在地图上迭代时出现奇怪的问题
问题描述
我有一张瓷砖地图,其中包含我所有的瓷砖。我想擦除一个瓷砖并同时继续绘制我的瓷砖。
问题是,在我擦除了一个图块(如 index = 2)之后,第一次完整的图块绘制迭代是正确的(绘制 0,1,3,4,...),但第二个会崩溃,因为它试图绘制所有瓷砖 (0,1,2,3,...)
这是我擦除一块瓷砖的代码
auto it = tiles.begin();
while(it != tiles.end()){
if(it->first == i){
it = tiles.erase(it);
}
else
++it;
}
这是我要绘制的代码
for(auto& itr : tiles){
if(itr.first == limit)
break;
if(itr.first < 10){
cout<<"draw : "<<itr.first<<"\t"<<itr.second.str()<<endl;
}
itr.second.draw(window,dt);
}
(限制是不要迭代 x 数千个图块)
这里是控制台输出
平局:0 (0,24) 平局:1 (32,24)平局:2 (64,24)平局:3 (96,24)平局:4 (128,24)平局:5 (160) ,24) 停留平局 : 6 (192,24)停留平局 : 7 (224,24)停留平局 : 8 (256,24)停留平局 : 9 (288,24)停留
删除 0 : 0 (0,24)stay 1 (32,24)stay
平局:1 (32,24) 平局:2 (64,24)平局:3 (96,24)平局:4 (128,24)平局:5 (160,24)平局:6 (192) ,24) 停留平局:7 (224,24)停留平局:8 (256,24)停留平局:9 (288,24)停留
绘制:0(-1163005939,-1163005939)
对不起我的英语,谢谢你的帮助。
解决方案
当擦除迭代值时,迭代不能指向下一个,所以简单的方法是:
auto it = m.begin();
while (it != m.end())
{
if (it->first == 1)
m.erase(it++); // After return from erase function, it point to next pointer.
else
++it;
}
推荐阅读
- ios - 通过链接安装后 ios 应用程序未启动
- sql - 如何在 PostgreSQL 中搜索模式并忽略大小写?
- linux - 为什么 Kafka 无法连接到 Zookeeper?
- python - 如何解决以下错误:ValueError: Found array with 0 sample(s) (shape=(0,)) while a minimum of 1 is required
- python - 如何在命令提示符下下推当前行中打印的文本?(Windows 上的 Python 3.8)
- gradle - 使用 Clojurephant 混合 Clojure 和 ClojureScript 构建
- python - 不返回python函数中的内容
- php - 如何将数据从 mysite.com 传递到 anothersite.com?
- c# - .NET Core 3.1下存储过程返回数据集
- reactjs - 如何根据 react-table v.6 中特定行的另一个下拉列表填充下拉列表