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 ++ ;
- }
相關文章
- STL使用篇__vector
- C++ remove erase 用法淺析C++REM
- 太極1:STL:vector和string
- STL容器---Vector
- C++ STL -- vectorC++
- STL---vector(向量)
- STL:vector用法總結
- 初探STL容器之Vector
- STL原始碼剖析——vector容器原始碼
- 最詳細STL(一)vector
- STL----vector注意事項
- STL-Vector容量問題:
- STL的map使用和分析
- C++STL第二篇(vector的原理用法)C++
- C++ 學習筆記(1):STL、Vector 與 SetC++筆記
- STL.vector容器刪除單個元素、部分元素、全部元素
- vector的使用注意點
- C++STL之Vector向量詳解,用法和例子 一起學習 一起加油C++
- E - Insert or Erase
- vector 使用 上
- Vector和Stack
- C++ 容器vector的使用C++
- stl__使用篇
- STL使用篇__list
- STL使用篇__deque
- STL使用篇__map
- STL使用篇__set
- STL使用篇__multimap
- STL使用篇__multiset
- STL使用篇__容器
- STL使用篇__bitset
- C++ list eraseC++
- 【譯】Rust中的array、vector和sliceRust
- Java中Vector和ArrayList的區別Java
- STL使用篇__順序容器
- STL_map和multimap容器
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- C++【vector】用法和例子C++
- map和set對vector排序排序