不用多想,就應(yīng)該能猜出錯(cuò)誤的根源,因?yàn)閑rase()操作會(huì)使后面的迭代器失效,當(dāng)刪除掉第一個(gè)值為3的元素后,后面的迭代器跟之前的迭代器不同了,如果還是在以前迭代器的基礎(chǔ)上進(jìn)行++操作的話,就會(huì)出現(xiàn)上面的問題,在C++ Primer中的9.2.2節(jié)也提到了這一點(diǎn),使用erase()操作后,任何指向已刪除元素的迭代器都具有無效值,畢竟該迭代器指向了容器中不再存在的元素。
如果想比較保險(xiǎn)的刪除容器中的一個(gè)元素的話,還是推薦使用泛型算法remove_if()好了,首先需要指出的是,泛型算法不依賴于特定的容器類型,它是“泛型”的,可作用在不同類型的容器和不同類型的元素上。此外,還有這些算法從不使用容器操作,因而其實(shí)現(xiàn)和類型無關(guān),元素的訪問和遍歷都是通過迭代器實(shí)現(xiàn)的,泛型算法可能會(huì)改變存儲(chǔ)在容器中的元素的值,也許會(huì)在容器中移動(dòng)元素,但是,算法從不直接添加或者刪除元素。
首先介紹下msdn中對remove_if()的介紹:算法的功能是:Eliminates elements that satisfy a predicate from a given range without disturbing the order of the remaining elements and returning the end of a new range free of the specified value.翻譯過來就是說:在一個(gè)給定范圍內(nèi)刪除滿足一定條件的元素,在刪除元素的過程中不改變剩余元素的位置,并同時(shí)返回一個(gè)沒有要?jiǎng)h除元素的新容器的迭代器end值。我們可以利用這個(gè)remove_if()的返回值來刪除剩余的元素,這個(gè)只需要加入語句ivec.erase(remove_if(****),ivec.end());就可以了。
用remove()和remove_if()其實(shí)都可以很簡單的解決在上個(gè)程序中要解決的問題,remove()的返回值跟remove_if()的返回值是一樣的,程序如下:
剛才看到Effective C++中有關(guān)于這方面的知識(shí),第32條條款講到了刪除元素的知識(shí),可以去看下,這里就不再贅述了。
Powered by: C++博客 Copyright © 點(diǎn)點(diǎn)滴滴