我有一些类似下面的代码:

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 ...)
所以这是问题

在某些 map 值的情况下,此代码将输出
2
3
4
6
7
8
9
5

如果 map 按容器以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;
  }
}

您的代码错误地对无效的迭代器(即it2之后的erase)执行了增量,这是未定义的行为。

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

09-06 04:14