我有一些像这样的代码:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用map,因为元素并不总是按此顺序(1,2 ...)
所以这是问题
在某些地图值的情况下,此代码打印此信息
2
3
4
6
7
8
9
5
Run Code Online (Sandbox Code Playgroud)
5如果可以(跳过),如果地图按容器顺序排序1,2 ......等等?
Ker*_* SB 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;
}
}
Run Code Online (Sandbox Code Playgroud)
您的代码错误地在无效迭代器(即it2之后erase)上执行增量,这是未定义的行为.
(对于某些其他容器类型,erase将迭代器返回到下一个有效元素,因此在这些情况下,您会说it = v.erase(it);但最佳擦除模式的详细信息取决于具体的容器类型.)
| 归档时间: |
|
| 查看次数: |
523 次 |
| 最近记录: |