注意:此程序在win环境下会出现上述描述的问题;在mac环境下第一种方式是正常运行的。Map.erase有3个重载函数:
void erase(iterator position);
size_type erase(const key_type& x); // 这个如果size_type为int,则返回值为1时代表删除成功,为0代表删除失败。
void erase(iterator first, iterator last); // 相当于map.clean()。
1. 错误示范
备注:map是关联式容器,调用erase后,当前迭代器已经失效
std::map<int, int> mmap; mmap[0] = 0; mmap[1] = 1; mmap[2] = 2; mmap[3] = 3; std::map<int, int>:: iterator it = mmap.begin(); for( ; it!=mmap.end(); it++) { if(it->first == 2) { mmap.erase(it); //执行后,it失效,程序崩溃。 } }
2. 正确示范(1)
std::map<int, int> mmap; mmap[0] = 0; mmap[1] = 1; mmap[2] = 2; mmap[3] = 3; std::map<int, int>:: iterator it = mmap.begin(); for( ; it!=mmap.end(); it++) { if(it->first == 2) { mmap.erase(it++); // erase之后,令当前迭代器指向其后继。 } }
3. 正确示范(2)
备注:利用erase的返回值,注意,有些版本的stl-map没有返回值,比如SGI版,但vc版的有。
std::map<int, int> mmap; mmap[0] = 0; mmap[1] = 1; mmap[2] = 2; mmap[3] = 3; std::map<int, int>:: iterator it = mmap.begin(); for( ; it!=mmap.end(); ) { if(it->first == 2) { it = mmap.erase(it); // erase的返回值是指向被删除元素的后继元素的迭代器 } else { it++; } }