不用多想,就應該能猜出錯誤的根源,因為erase()操作會使后面的迭代器失效,當刪除掉第一個值為3的元素后,后面的迭代器跟之前的迭代器不同了,如果還是在以前迭代器的基礎上進行++操作的話,就會出現上面的問題,在C++ Primer中的9.2.2節也提到了這一點,使用erase()操作后,任何指向已刪除元素的迭代器都具有無效值,畢竟該迭代器指向了容器中不再存在的元素。
如果想比較保險的刪除容器中的一個元素的話,還是推薦使用泛型算法remove_if()好了,首先需要指出的是,泛型算法不依賴于特定的容器類型,它是“泛型”的,可作用在不同類型的容器和不同類型的元素上。此外,還有這些算法從不使用容器操作,因而其實現和類型無關,元素的訪問和遍歷都是通過迭代器實現的,泛型算法可能會改變存儲在容器中的元素的值,也許會在容器中移動元素,但是,算法從不直接添加或者刪除元素。
首先介紹下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.翻譯過來就是說:在一個給定范圍內刪除滿足一定條件的元素,在刪除元素的過程中不改變剩余元素的位置,并同時返回一個沒有要刪除元素的新容器的迭代器end值。我們可以利用這個remove_if()的返回值來刪除剩余的元素,這個只需要加入語句ivec.erase(remove_if(****),ivec.end());就可以了。
用remove()和remove_if()其實都可以很簡單的解決在上個程序中要解決的問題,remove()的返回值跟remove_if()的返回值是一樣的,程序如下:
剛才看到Effective C++中有關于這方面的知識,第32條條款講到了刪除元素的知識,可以去看下,這里就不再贅述了。
Powered by: C++博客 Copyright © 點點滴滴