簡體   English   中英

在 c++ 中擦除后在 map 上迭代時出現奇怪的問題

[英]Strange problem while iterating on a map after erasing in c++

我有一個瓷磚 map 包含我所有的瓷磚。 我想擦除一個瓷磚並同時繼續繪制我的瓷磚。

問題是,在我擦除了一個圖塊(如 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 數千個圖塊)

這里是控制台 output

平局: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;
  }

我認為您很可能實際上並沒有從您正在繪制的瓷磚 map 中刪除元素。 您如何將 map 傳遞給刪除瓷磚的代碼? 您可能正在某處創建副本。

僅供參考,這樣的代碼可以工作,所以你的代碼沒有明顯的錯誤。 該錯誤位於您發布的代碼之外的某個地方。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM