你说得对,顶楼的第一个for循环里的代码erase(it++)对于std::map、std::set是正确的,我之前以为这个写法对于std::map也是有问题的。
在函数调用erase()之前,这个函数所有的参数的side effect都需要计算完(C++标准规定的)。
所以在调用erase()之前,it++这个表达式已经求值了,it指向了下一个迭代器位置,而传给erase()的是it在加1之前的值。
调用完erase()之后,对于std::map,下一个迭代器的位置依旧是有效的,没问题。
如果要无视容器类型,it = myContainer.erase(it)通用点(但是老标准里erase()的返回值是void)。
而且自定义的容器在实现erase()时要保持这个语义。
【 在 KnightZorro 的大作中提到: 】
:
https://stackoverflow.com/questions/7349899/how-are-map-iterators-invalidated-when-erasing-elements: map->erase(it++)
: it 这个变量对应的迭代器并没有失效啊.
--
修改:z16166 FROM 61.48.130.*
FROM 61.48.130.*