2011-11-16 108 views
1

我有一些事情是这样的代码:的std ::地图::擦除和迭代器

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 

它是如何可能的(跳过5),如果地图按容器顺序排序1,2 ...等等?

+0

-1没有提供一个完整的程序来演示问题。请将您的示例程序简化为**完整**,**最小**程序,以显示问题。一个*完整*程序是我们可以复制粘贴到文件并按原样编译的程序。一个*最小*程序没有与问题无关的代码。有关为什么这很重要的原因,请参阅http://sscce.org。 –

回答

12

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

您的代码错误地执行对一个无效的迭代器(在eraseit2后),这是不确定的行为的增量。

(对于某些其他容器类型,erase返回一个迭代到下一个有效的元素,所以在这种情况下,你会说it = v.erase(it);但最好的擦除模式的细节取决于具体的容器类型。)