STL Vector remove()和erase()的使用
http://blog.csdn.net/ozwarld/article/details/7761519
STL中remove()只是將待刪除元素之後的元素移動到vector的前端,而不是刪除。若要真正移除,需要搭配使用erase()。
例子如下:
- // remove.cpp
- // compile with: /EHsc
- // Illustrates how to use the remove function.
- //
- // Functions:
- // remove - remove all elements from the sequence that match value.
- // begin - Returns an iterator that points to the first element in a
- // sequence.
- // end - Returns an iterator that points one past the end of a sequence.
- //////////////////////////////////////////////////////////////////////
- // disable warning C4786: symbol greater than 255 character,
- // okay to ignore
- #pragma warning(disable: 4786)
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <functional>
- using namespace std;
- int main()
- {
- const int VECTOR_SIZE = 8 ;
- // Define a template class vector of integers
- typedef vector<int > IntVector ;
- //Define an iterator for template class vector of integer
- typedef IntVector::iterator IntVectorIt ;
- IntVector Numbers(VECTOR_SIZE) ; //vector containing numbers
- IntVectorIt start, end, it, last;
- start = Numbers.begin() ; // location of first
- // element of Numbers
- end = Numbers.end() ; // one past the location
- // last element of Numbers
- //Initialize vector Numbers
- Numbers[0] = 10 ;
- Numbers[1] = 20 ;
- Numbers[2] = 10 ;
- Numbers[3] = 15 ;
- Numbers[4] = 12 ;
- Numbers[5] = 7 ;
- Numbers[6] = 9 ;
- Numbers[7] = 10 ;
- cout << "Before calling remove" << endl ;
- // print content of Numbers
- cout << "Numbers { " ;
- for(it = start; it != end; it++)
- cout << *it << " " ;
- cout << " }\n" << endl ;
- // remove all elements from Numbers that match 10
- last = remove(start, end, 10) ;
- cout << "After calling remove" << endl ;
- // print content of Numbers
- cout << "Numbers { " ;
- for(it = start; it != end; it++)
- cout << *it << " " ;
- cout << " }\n" << endl ;
- //print number of elements removed from Numbers
- cout << "Total number of elements removed from Numbers = "
- << end - last << endl ;
- //print only the valid elements of Number
- cout << "Valid elements of Numbers { " ;
- for(it = start; it != last; it++)
- cout << *it << " " ;
- cout << " }\n" << endl ;
- }
Output
我們可以看出:
對於原vector { 10 20 10 15 12 7 9 10 },刪除10,會將10後面的元素移動到前面
(注意以下逐個元素對齊,模擬元素在記憶體中的位置,這樣就容易看出變化規律)
原vector
10 20 10 15 12 7 9 10
遇到第一個10,陣列變成
20 10 15 12 7 9 10
遇到第二個10移動到7 9之後又遇到第三個10於是剩下記憶體中未移動的7 9
20 15 12 7 9 7 9 10
遇到第三個10
20 15 12 7 9 7 9 10
因此,remove()需要和erase()配合使用
svec.erase(remove(svec.begin(),svec.end(),"be"), svec.end());
這句的意思是,取得"be"的位置(位於結尾),然後刪除"be"到原vector結尾的所有元素
- 附註:
- iterator的使用陷阱:
- vector<int> veci;
- veci.push_back(1);
- veci.push_back(2);
- veci.push_back(3);
- veci.push_back(4);
- veci.push_back(5);
- veci.push_back(3);
- veci.push_back(2);
- veci.push_back(3);
- for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
- {
- if( *iter == 3)
- veci.erase(iter);
- }
這樣使用是錯誤的,因為earase結束後,iter變成了野指標,iter++就產生了錯誤。
erase()返回值是一個迭代器,指向刪除元素下一個元素;如果是刪除某範圍內的元素時:返回值也表示一個迭代器,指向最後一個刪除元素的下一個元素;
- for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); iter++)
- {
- if( *iter == 3)
- iter = veci.erase(iter);
- }
這樣無法刪除連續兩個3.
需要寫成:
- for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
- {
- if( *iter == 3)
- iter = veci.erase(iter);
- else
- iter ++ ;
- }
相關文章
- C++學習之路(vector::clear和vector::erase的區別)C++
- C++ remove erase 用法淺析C++REM
- STL 的 erase() 陷阱-迭代器失效總結
- STL——STL中vector的實現原理
- C++ STL -- vectorC++
- 《STL原始碼剖析》-- stl_vector.h原始碼
- 初探STL容器之Vector
- STL:vector用法總結
- STL原始碼剖析——vector容器原始碼
- C++ STL學習——vectorC++
- STL 之 vector 容器詳解
- C++_STL—容器Vector篇C++
- STL vector中的shrink_to_fit方法(32)
- 精通標準模板庫STL的向量Vector用法
- STL的map使用和分析
- stl 中list 或者vector正確使用find查詢類物件物件
- STL vector的內部實現原理及基本用法
- C++STL第二篇(vector的原理用法)C++
- 例說資料結構&STL(一)——vector資料結構
- UVA 11991 STL中map、vector的應用
- GUN C++ STL中的vector的記憶體分配器C++記憶體
- vector的使用注意點
- STL.vector容器刪除單個元素、部分元素、全部元素
- Effective STL:Item 16: Know how to pass vector and string data to (轉)
- E - Insert or Erase
- C++ list eraseC++
- C++STL之Vector向量詳解,用法和例子 一起學習 一起加油C++
- Vector和ArrayList的區別
- C++ 容器vector的使用C++
- STL使用篇__bitset
- ArrayList 和 Vector 的區別 -JAVAJava
- STL裡的multimap使用詳解
- VC++中STL的使用 (轉)C++
- C++中vector*和vector有什麼區別C++
- 演算法學習之路|用C++刷演算法會用到的STL(一)——vector演算法C++
- vector和iterator及collection
- Java中Vector和ArrayList的區別Java
- 【譯】Rust中的array、vector和sliceRust