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獲得下乙個元素的迭代器,然後再刪除當前元素。
STL中remove 和erase 的用法
示例 initializer listlist t vectorvec list t vector iterator it for it vec.begin it vec.end it cout endl remove vec.begin vec.end 1 for it vec.begin it ...
STL之remove演算法詳解
template type forwarditerator remove forwarditerator first,forwarditerator last,const type val 將乙個指定的值從指定的區間中 first,last 刪除 這裡的 刪除 是指 把區間內 指定值 的位置騰出,用...
C unique 函式和erase 函式
unique 是c 語言中的stl函式,包含於標頭檔案中。功能是將陣列中相鄰的重複元素去除。然而其本質是將重複的元素移動到陣列的末尾,最後再將迭代器末尾指向最後不重複的下標。返回的是乙個指向最後不重複元素的迭代器。因為是去除相鄰的重複元素,所以要用sort先對陣列進行排序才行。語法 erase方法在...