容器list使用之erase

2021-07-09 11:56:52 字數 1348 閱讀 9014

今天程式裡面使用了list容器,其中用到了erase()函式,程式竟然崩潰了,

之前一直沒出現問題,感覺莫名奇妙。花了點時間,搞清楚了erase()函式的機理。

常用的刪除容器中元素的方法是如下(方法1):

list< int> list;

list< int>::iterator iter;

for( iter = list.begin(); iter != list.end(); )

else

}

也可以這樣寫(方法2):

list< int> list;

list< int>::iterator iter;

for( iter = list.begin(); iter != list.end(); )

else

}

有一種錯誤的寫法(注意同方法2比較)

list< int> list;

list< int>::iterator iter;

for( iter = list.begin(); iter != list.end(); )

iter++;

}

我們看一下erase()函式的源**(僅列出release下的**)。

iterator erase(iterator _where)

return (_where);

}

函式在返回的時候,是返回當前迭代器的下乙個節點。所以當 iter = list.erase( iter ); 執行以後,迭代器自動指向了下乙個元素。而對於入參中的iter,所指的位址已經被銷毀,所以寫的時候,應該注意加上前面的iter =,並且是不需要再進行iter++操作。

那另外的一種寫法,list.erase( iter++ ); 為什麼也是對的呢?

這裡研究了一下,這裡需要講一下++運算子的操作。

_myt_iter& operator++()   

_myt_iter operator++(int)

++實際上可以看做是乙個函式。

對於++在後的情況(例如i++),函式在執行的時候,將運算的資料i已經改變,但是函式的返回值是操作之前的資料,所以在我們看來,i++好像是先進行了i的讀取,才+1。

回到迭代器,list.erase( iter++ );就沒有問題了。

對於那種錯誤的方法,list.erase( iter );在執行以後,iter所指的物件已經被銷毀,所以再對iter進行操作是非法的,程式會出錯。

容器list使用之erase

程式裡面使用了list容器,其中用到了erase 函式。花了點時間,搞清楚了erase 函式的機理。常用的刪除容器中元素的方法是如下 方法1 list int list list int iterator iter for iter list.begin iter list.end else 也可以...

關於List容器的erase

之前在程式裡面使用了list容器,其中用到了erase 函式,之前一直沒出現問題,這兩天突然莫名奇妙。花了點時間,搞清楚了erase 函式的機理。常用的刪除容器中元素的方法是如下 方法1 list int list list int iterator iter for iter list.begin...

list vector map容器erase的區別

一句話總結 list vector返回的迭代器,map返回空 c 98標準 注意迭代器不要越界。map是從模板類繼承來的,不同的c 版本標準其erase函式也不同 c 98 c 11 void erase iterator position iterator erase const iterator...