簡體   English   中英

std :: map :: erase和迭代器

[英]std::map::erase & iterators

我有一些類似下面的代碼:

map<int, string> m;

m[1] = "a";
m[2] = "b";
m[3] = "a";
m[4] = "a";
m[5] = "e";
m[6] = "f";
m[7] = "g";
m[8] = "h";
m[9] = "i";

for (it1 = src.begin(); it1 != src.end(); ++it1) {

    for (it2 = it1; it2 != src.end(); ++it2) {
        if (it2 == it1) {
            continue;
        }

        if (it2->second == it1->second) {
            fprintf(stderr, "%u\n", it2->first);
            src.erase(it2);
        }
    }
}

我使用map ,因為元素並不總是按此順序(1、2 ...)
所以這是問題

在某些情況下,此代碼將打印

2
3
4
6
7
8
9
5

如果地圖按容器順序1、2 ...依此類推,怎么可能(跳過5 )?

您的erase循環已關閉。 典型的成語是這樣的:

for(std::map<K,V>::const_iterator it = v.begin(); it != v.end() /* not hoisted! */; /* no increment */ )
{
  // do something
  if (suitable_condition)
  {
    v.erase(it++);
  }
  else
  {
    ++it;
  }
}

您的代碼錯誤地對無效的迭代器執行增量(即, erase之后的it2 ),這是未定義的行為。

(對於某些其他容器類型, erase將迭代器返回到下一個有效元素,因此在那種情況下,您會說它it = v.erase(it) ;但是最佳擦除模式的細節取決於具體的容器類型。)

暫無
暫無

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

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