remove演算法和erase成員函式

2021-07-04 05:59:53 字數 1273 閱讀 6669

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方法在...