remove算法和erase成員函數

1. remove算法和容器的erase成員函數
remove 操作移除[first,last)之中所有與value相等的元素。這一算法並不真正從容器中刪除那些元素(換句話說容器的大小並沒有改變),而是將每一個不與value相等的元素輪番賦值給first之後的空間也就是說,所有和value相同值的元素都會被覆蓋,而其他的元素都會依次前移。最後remove返回"指向最後一個   '有用'   元素的iterator",但是在remove算法過程中,並沒有修改原容器的size,以及end()。
移除容器裏面的元素不應該使用remove算法,而是容器自己的方法erase()。
爲什麼這麼設計:
STL將算法和數據結構分離開來,以迭代器爲接口,迭代器對自己所屬的容器一無所知。任何“以迭代器訪問容器元素”的算法,都不得(無法)透過迭代器調用容器類別所提供的任何成員函數。
刪除元素可以使用如下語句:c.erase(remove(beg, end),  c.end() );將邏輯終點和物理終點之間的元素刪除。
特殊情況:
List:
由於List不是順序容器,調用remove算法會使移動被刪除元素之後的元素,效率很低,所以使用自身的remove成員函數,直接更改指針的指向即可。
②Set等關聯容器:
從迭代器的角度來看,容器中的元素都是常量,這保證不能人爲改變元素的值,從而打亂元素的順序,所以不能對Set元素調用變動性算法。
因爲remove算法是用後面的元素覆蓋被刪除元素,所以不能調用remove算法,只能使用set容器的成員函數erase()

2. 順序容器和關聯容器的find與erase
①關聯容器查找元素時應使用成員函數find(),而不是通用算法find(),因爲關聯容器底層是二叉樹,使用成員函數find可以獲得更好的性能。
②關聯容器中的erase成員函數,與順序容器中的erase成員函數返回值不同,順序容器erase返回被刪除元素的下一個元素的iterator,而關聯容器不返回任何東西。同樣也是因爲關聯容器底層是二叉樹,返回後繼節點可能頗爲耗時。

注意:使用erase時,該迭代器會失效,故在循環中使用erase時:
①對順序容器和list:使用erase的返回值來更新迭代器
②對關聯容器:erase(pos ++),先對pos加1獲得下一個元素的迭代器,然後再刪除當前元素。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章