在c++中擦除后在映射上迭代时出现的奇怪问题



我有一个瓦片映射,其中包含我的所有瓦片。我想擦除一个瓦片,并在同一时间继续绘制我的瓦片。

问题是,在我擦除了一个瓦片(如索引=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(-113005939,-11300593(

对不起我的英语,谢谢你的帮助。

当擦除迭代的值时,迭代无法指向下一个,所以简单的方法是:

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;
}

我认为最有可能的是,您实际上并没有从当时绘制的平铺图中删除元素。如何将映射传递给移除瓦片的代码?您可能正在某处创建副本。

仅供参考,这样的代码是有效的,所以你的代码没有明显的错误。这个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;
}

最新更新