【发布时间】:2020-03-12 10:49:25
【问题描述】:
我有一个包含我所有图块的图块地图。我想擦除一个图块并同时继续绘制我的图块。
问题是,在我擦除了一个图块(如索引 = 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) 停留 1 (32,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 (-1163005939,-1163005939)
对不起我的英语,谢谢你的帮助。
【问题讨论】:
-
为什么不
tiles.erase(tiles.find(i))? -
您的代码中某处存在错误。错误可以在任何地方。显示的代码中没有任何内容表明错误是什么;因此,您必须显示 minimal reproducible example,否则 stackoverflow.com 上的任何人都不太可能为您提供帮助。有关详细信息,请参阅How to Ask。
-
句中and continue draw in the same time,你的意思是来自另一个线程吗?如果是这样,当另一个线程迭代它时,您不能从一个线程修改映射。如果你想这样做,你必须使用锁(例如
std::mutex)。
标签: c++ dictionary iterator erase