erase函數的原型如下:
(1)string& erase ( size_t pos = 0, size_t n = npos );
(2)iterator erase ( iterator position );
(3)iterator erase ( iterator first, iterator last );
也就是說有三種用法:
(1)erase(pos,n); 刪除從pos開始的n個字符,比如erase(0,1)就是刪除第一個字符
(2)erase(position);刪除position處的一個字符(position是個string類型的迭代器)
(3)erase(first,last);刪除從first到last之間的字符(first和last都是迭代器)
下面給你一個例子:
#include <string>
using namespace std;
int main ()
{
string str ("This is an example phrase.");
string::iterator it;
// 第(1)種用法
str.erase (10,8);
cout << str << endl; // "This is an phrase."
// 第(2)種用法
it=str.begin()+9;
str.erase (it);
cout << str << endl; // "This is a phrase."
// 第(3)種用法
str.erase (str.begin()+5, str.end()-7);
cout << str << endl; // "This phrase."
return 0;
}
erase()函數的功能是用來刪除容器中的元素
刪除某個容器里的某個元素:c.erase(T);
看似一個簡單的動作,然而對不同類型的容器,內部卻做了截然不同的事情,后面介紹。 假設有這樣一個題目,將某個容器中所有滿足條件N == X的元素刪除,按照常規的思路應該有類似這樣的代碼:
// 假設Container和container分別表示一種容器和對應的一個對象
Container<T>::iterator it;
for (it = container.begin(); it != container.end(); ++it) {
if (N == X)
container.erase(it);
}
然而這樣的代碼對於任一種容器都是錯誤的
容器按內存分配方式可以分為鏈表容器和數組容器。
所謂的鏈 表容器指的是一種表現方式,包括list、slist等這樣基於節點的容器(動態分配內存塊)和set、map、multiset、multimap等關 聯容器(平衡樹實現),而數組容器指的是在一塊連續的內存上保存元素的連續內存容器,比如vector、deque、string等。
鏈表容器 以list為例,當執行container.erase(it)時,確實第一個滿足條件的元素刪除了,但這時it指針已經被刪除了,它也不指向任何元素 了,所以也只能到此為止了,也就是說上面的代碼對於鏈表容器來說只能正確刪除第一個滿足條件的元素,針對這個問題我們首先想到的就是在刪除指針之前,給其 做個備份。
將這個臨時變量直接建立在erase實現里,這樣做更簡潔,也顯得專業些。
list<int>::iterator it;
for (it = lt.begin(); it != lt.end(); ) {
if (*it % 2 == 0)
lt.erase(it++); //這里是關鍵
else
++it;
}
鏈表容器使用erase刪除節點還有一個特點,就是會將下一個元素的地址返回,所以也可以這樣實現:
list<int>::iterator it;
for (it = lt.begin(); it != lt.end(); ) {
if (*it % 2 == 0)
it = lt.erase(it);//自動返回下一個元素的地址,不用再主動前移指針
else
++it;
}
vector<int>::iterator it = v.begin();
for (it = v.begin(); it != v.end(); ) {
if (*it % 2 == 0)
v.erase(it);//刪除元素后,后面元素自動往前移,不用挪動指
else
++it;
}
網上有說在VS2005里面上面的v.erase(it)寫法是行的 VS2008及2010卻運行會出現錯誤 會出現
vector erase iterator outside range 最保險的做法是將v.erase(it)改成 it=v.erase(it)