list在圓桌問題迴圈遍歷彈出的兩個問題

2021-08-18 23:14:57 字數 1011 閱讀 6273

在類似圓桌迴圈遍歷,然後逐個彈出元素的問題上遇到了兩個程式錯誤,

第乙個是   list iterator dereferenable的問題

因為逐個刪除元素的過程中,有兩種寫法讓迭代器  it 重新指向list的下乙個元素

listq;

list:: iterator it ;

1,it = q.erase(it),

這裡it 被刪除後,it會自動指向下乙個元素,然後重新賦給it;

2,q.erase(++it)  ;

++it 的道理很簡單,即 it = it +1;++it 返回的值是沒有加1的那個值,刪除後,it將變成it+1這個值

那麼,在圓桌問題刪除元素的過程中,就有可能在list容器已經位空的的時候還在進行圓桌迴圈遍歷,這個就是出現 list iterator dereferenable 問題的原因。解決的方法就是在刪除元素的下一行多加一條判斷語句  if(q.empty) break 我遇到問題的時候雖然也加了這條語句,但是,並沒有加在刪除**的下一行,所以導致了程式錯誤;

第二個問題就是 

list iterator incrememtable 

這個問題其實就是乙個 迭代器指向失效的問題 

我上面的兩種刪除後it重新賦值的方法其實在個別問題上是存在一些缺陷的,

圓桌迴圈的關鍵語句是   if(it == q.end()) it = q.begin();  就是當it指向list容器最末尾的時候,在重新將it迭代器指向list容器的開頭來達到乙個圓桌迴圈的過程,那麼 在迴圈過程中用到的  for迴圈,很多人都習慣的喜歡把 ++it 寫在for迴圈的括號裡

for( it = q.begin() ; ; ++it)  像這樣,但是,這樣的寫法可能會出現一些問題,就是,當it = q.end() 是沒有任何值得,是乙個空值,如果把這個空值帶進迴圈內執行,就會出現一些問題,那麼最安全得寫法就是把 ++it 單獨放出來(**的目的可以忽視)

if (num == cnt) 

else

c foreach遍歷迴圈List

在jsp中如何用jstl的c foreach遍歷元素是map型別的list?request中有個 admin.dealers 屬性,是個元素是map型別的list,其傎如下所示 在jsp中如何用jstl的c foreach遍歷所有的dealerid與dealername?解決方案 遍歷的物件實際上是...

List 迴圈遍歷中刪除元素問題一

這裡以arraylist為例介紹list實現類在迴圈過程刪除元素會遇到的問題。乙個arraylist在迴圈過程中刪除,會不會出問題,為什麼?接下來給大家詳細解釋一下在這個過程中會出現的問題和原因及解決方法。arraylist中的remove方法 注意arraylist中的remove有兩個同名方法,...

List集合的迴圈遍歷方式

list集合的特點 list集合的三種遍歷方式 建立乙個arraylist集合 我就用arraylist舉例 該集合屬於list介面其中之一的實現類 arraylist linkedlist vector 同理遍歷方式相同 listlist new arraylist 向集合中新增一些元素 list...