凡是非顺序容器 erase后 迭代器失效 原因:把非顺序容器的存储结构都想象成 链表 stl erase后返回的是当天容器对象 在链表元素被删除后 不可能通过原来指向此元素的指针来找到下一个对象 错误代码 int main(int argc, char* argv[]) { map<string, string> mapData; mapData["a"] = "aaa"; mapData["b"] = "bbb"; mapData["c"] = "ccc"; map<string, string>::iterator i=mapData.begin(); for (; i!=mapData.end(); i++) { if (i->first == "b") mapData.erase(i); } return 0; } 正确代码 int main(int argc, char* argv[]) { map<string, string> mapData; mapData["a"] = "aaa"; mapData["b"] = "bbb"; mapData["c"] = "ccc"; map<string, string>::iterator i=mapData.begin(); for (; i!=mapData.end();) { if (i->first == "b") mapData.erase(i++); else i++; } return 0; }