我有一个瓷砖地图,其中包含我所有的瓷砖。我想擦除一个瓷砖,并在同一时间继续绘制我的瓷砖。
问题是,在我擦除了一个瓦片(如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)停留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)
我的英语很抱歉,谢谢你的帮助。
发布于 2019-12-06 05:19:37
当擦除迭代的值时,迭代不能指向下一个迭代,因此简单的方法是:
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;
}发布于 2019-11-16 21:57:59
我认为最有可能的情况是,您实际上并没有从您正在绘制的平铺地图中删除该元素。如何将map传递给删除tiles的代码?您可能正在某处创建一个副本。
仅供参考,像这样的代码可以工作,所以你的代码没有明显的错误。bug在您发布的代码之外的某个地方。
int main() {
std::map<int, std::string> m = {{0, "A"}, {1, "B"}, {2, "C"}};
for (auto& t : m) {
std::cout << t.first << " = " << t.second << std::endl;
}
auto it = m.begin();
while (it != m.end()) {
if (it->first == 1) {
it = m.erase(it);
} else {
++it;
}
}
for (auto& t : m) {
std::cout << t.first << " = " << t.second << std::endl;
}
return 0;
}https://stackoverflow.com/questions/58891325
复制相似问题