這種刪除方式也是STL源碼一書中推薦的方式,分析 mapStudent.erase(iter++)語句,map中在刪除iter的時候,先將iter做緩存,然后執(zhí)行iter++使之指向下一個結(jié)點,再進入erase函數(shù)體中執(zhí)行刪除操作,刪除時使用的iter就是緩存下來的iter(也就是當(dāng)前iter(做了加操作之后的iter)所指向結(jié)點的上一個結(jié)點)。 根據(jù)以上分析,可以看出mapStudent.erase(iter++)和map Student.erase(iter); iter++;這個執(zhí)行序列是不相同的。前者在erase執(zhí)行前進行了加操作,在iter被刪除(失效)前進行了加操作,是安全的;后者是在erase執(zhí)行后才進行加操作,而此時iter已經(jīng)被刪除(當(dāng)前的迭代器已經(jīng)失效了),對一個已經(jīng)失效的迭代器進行加操作,行為是不可預(yù)期的,這種寫法勢必會導(dǎo)致 map操作的失敗并引起進程的異常。
新聞熱點
疑難解答