STL笔记(4)关于erase,remove
STL筆記(4)關于erase,remove
你要erase的元素很容易識別。它們是從區間的“新邏輯終點”開始持續到區間真的終點的原來區間的元素。要除去那些元素,你要做的所有事情就是用那兩個迭代器調用erase的區間形式(參見條款5)。因為remove本身很方便地返回了區間新邏輯終點的迭代器,這個調用很直截了當:
vector<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笔记(4)关于erase,remove的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java excel表格数据导入
- 下一篇: Atitit。DD dragdrop拖拽