STL筆記(4)關於erase,remove

2021-09-05 16:43:19 字數 1337 閱讀 2959

你要erase的元素很容易識別。它們是從區間的「新邏輯終點」開始持續到區間真的終點的原來區間的元素。要除去那些元素,你要做的所有事情就是用那兩個迭代器呼叫erase的區間形式(參見條款5)。因為remove本身很方便地返回了區間新邏輯終點的迭代器,這個呼叫很直截了當:

<

int>

v;                        

//正如從前

v.erase(remove(v.begin(), v.end(), 

99), v.end());        

//真的刪除所有

//等於99的元素

cout 

<<

v.size();                        

//現在返回7

把remove的返回值作為erase區間形式第乙個實參傳遞很常見,這是個慣用法。事實上,remove和erase是親密聯盟,這兩個整合到list成員函式remove中。這是stl中唯一名叫remove又能從容器中除去元素的函式:

list

<

int>

li;            

//建立乙個list

//放一些值進去

li.remove(

99);            

//除去所有等於99的元素:

//真的刪除元素,

//所以它的大小可能改變了

坦白地說,呼叫這個remove函式是乙個stl中的矛盾。在關聯容器中類似的函式叫erase,list的remove也可以叫做erase。但它沒有,所以我們都必須習慣它。我們所處於的世界不是所有可能中最好的世界,但卻是我們所處的。(附加一點,條款44指出,對於list,呼叫remove成員函式比應用erase-remove慣用法更高效。)

一旦你知道了remove不能「真的」從乙個容器中刪除東西,和erase聯合使用就變成理所當然了。你要記住的唯一其他的東西是remove不是唯一這種情況的演算法。另外有兩種「類似remove」的演算法:remove_if和unique。

remove和remove_if之間的相似性很直截了當。所以我不會細講,但unique行為也像remove。它用來從乙個區間刪除東西(鄰近的重複值)而不用訪問持有區間元素的容器。結果,如果你真的要從容器中刪除元素,你也必須成對呼叫unique和erase,unique在list中也類似於remove。正像list::remove真的刪除東西(而且比erase-remove慣用法高效得多)。list::unique也真的刪除鄰近的重複值(也比erase-unique高效)。

(譯註:《c++標準程式庫》111頁5.6節有remove的詳細解釋)

STL筆記 認識STL

c 標準模板庫的核心包括以下三個元件 1.容器 containers 容器是用來管理某一類物件的集合。c 提供了各種不同型別的容器,比如 deque list vector map 等。2.演算法 algorithms 演算法作用於容器。它們提供了執行各種操作的方式,包括對容器內容執行初始化 排序 ...

爬蟲筆記 關於Beautiful Soup 4

再使用beautiful soup 4時遇到了一些問題,找到了解決方法,通過本博文將遇到的問題和解決方法記錄下來,方便回顧也希望能幫助大家解決類似問題。遇到這個錯誤的原因是 文件包含以完全不同的編碼編寫的文字 這時候需要待解析文字的指定編碼方式,通常可以在網頁原始碼中找到網頁的編碼方式,就像下圖 接...

STL學習筆記

1.stl六大元件 1 容器 各種資料結構,如vector,list,deque,set,map,用來存放資料,從實現的角度看,stl容器是一種class template。2 演算法 各種常用的演算法如sort,search,copy,erase.從實現的角度看,stl演算法是一種function...