v.pushback(0);
v.pushback(1);
v.pushback(1);
v.pushback(0);
想要刪除值爲1的元素
錯誤代碼
vector<int>::iteratoritr = v.begin();
while(itr!=v.end())
{
if(*v==1)
{
v.erase(itr);
}
itr++;//這裏刪除後迭代器會更新出錯
}
正確代碼
vector<int>::iteratoritr = v.begin();
while(itr!=v.end())
{
if(*v==1)
{
itr=v.erase(itr);
}
else
itr++;
}
關於迭代器機制,好好研究。參見 http://blog.csdn.net/bruce_wang_janet/article/details/6879289
每一次刪除之後,後邊的元素都會向前移動。
所以當前迭代器實際已經指向下一個元素,若再+1,實際上是指向了下一個元素的下一個元素。
以下爲上述程序的詳細執行過程
int main(int argc, char* argv[])
{
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
vector<int>::iteratoritr = v.begin();
vector<int>::iteratortem = v.begin();
while(itr!=v.end())
{
cout<<"line1"<<*itr<<endl;
tem=itr;
itr++;
cout<<"line2"<<*itr<<endl;
v.erase(tem);
cout<<"line3"<<*itr<<endl;
}
printf("刪除後的長度爲%d",v.size());
return 0;
}
數據 |
1 |
2 |
3 |
4 |
未賦值 |
內存地址 |
B0 |
B4 |
B8 |
BC |
C0 |
指針 |
begin |
|
|
|
End |
|
|
|
|
|
Last |
執行第一個循環
tem=itr;
數據 |
1 |
2 |
3 |
4 |
未賦值 |
內存地址 |
B0 |
B4 |
B8 |
BC |
C0 |
指針 |
begin |
|
|
|
End |
|
Temitr |
|
|
|
Last |
itr++;
數據 |
1 |
2 |
3 |
4 |
未賦值 |
內存地址 |
B0 |
B4 |
B8 |
BC |
C0 |
指針 |
begin |
|
|
|
End |
|
Tem |
itr |
|
|
Last |
v.erase(tem);
數據 |
2 |
3 |
4 |
4 |
未賦值 |
內存地址 |
B0 |
B4 |
B8 |
BC |
C0 |
指針 |
begin |
|
|
Last |
End |
|
Tem |
itr |
|
|
|
第二輪循環
tem=itr;
數據 |
2 |
3 |
4 |
4 |
未賦值 |
內存地址 |
B0 |
B4 |
B8 |
BC |
C0 |
指針 |
begin |
Tem |
|
Last |
End |
|
|
itr |
|
|
|
itr++;
數據 |
2 |
3 |
4 |
4 |
未賦值 |
內存地址 |
B0 |
B4 |
B8 |
BC |
C0 |
指針 |
begin |
Tem |
|
Last |
End |
|
|
|
itr |
|
|
v.erase(tem);
數據 |
2 |
4 |
4 |
4 |
未賦值 |
內存地址 |
B0 |
B4 |
B8 |
BC |
C0 |
指針 |
begin |
Tem |
Last |
|
End |
|
|
|
itr |
|
|
可見,erase操作之後,last指針前移,而end指針未變,被刪除的元素後邊的元素前移,last之後的元素保持不變(並未移除)。完成之後計算size是由last-begin得到的。