當你用erase以迭代器方式刪除vector中的元素時,vector會自動將被刪除元素后邊的元素往上挪一位,所以此時指向刪除元素的迭代器指向了被刪除元素后面的元素,所以在循環中,此時迭代器就不應該加1了,大概像下面這種寫法
for (itE = listE.begin(); itE != listE.end();) { //取出一條邊 ActivityEdge* currE = *itE; if (currE->start == findV) { listE.erase(itE); } else { itE++; } }
上面的代碼在dev,cfree編譯器中運行沒有問題,但是在vs中運行這段代碼是會報錯的,程序會崩潰顯示vector iterators incompatible,我覺得這是vs的一個保護機制,也就是微軟的老頭們覺得用這個迭代器不太好,所以就禁用了。O(∩_∩)O,我覺得也是有點不好,因為這個迭代器本來是指向刪除元素的,但是元素刪除后,這個迭代器竟然指向了被刪除元素的下一個元素,感覺這個迭代器有點不忠心,本來是要和被刪除元素捆綁在一起的,但是在被刪除元素沒了之后,這個迭代器竟然偷偷摸摸的和別的元素有了關系,🤭,反正在vs各種版本中,上面的代碼都運行不了,那么如何改正呢?,見下面
for (itE = listE.begin(); itE != listE.end();) { //取出一條邊 ActivityEdge* currE = *itE; if (currE->start == findV) { itE=listE.erase(itE); } else { itE++; } }
這段代碼就是利用了erase的返回值,當我們用erase刪除一個元素后,erase返回的是下一個元素的迭代器,將這個返回值賦給那個原來指向被刪除元素的迭代器,所以這個迭代器就名正言順的指向了下一個元素,這比偷偷摸摸的行為好太多了。😄,嚴肅點說的話,感覺這就是顯式的讓迭代器指向了下一個元素,可能微軟的老頭們比較喜歡這種方式。