青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

路漫漫,長修遠,我們不能沒有錢
隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
數據加載中……

STL Vector 的遍歷刪除.

Vector 其實就類似動態數組. 事先分配好一定量的內存. 當需要的內存值大于某個閥值. 就重新申請內存. 重新分配. 當小于某個閥值, 也會導致重新分配.(自動收縮部分, stl沒有明確規定, 有些庫實現了)

正確: code1
      vector<string> vecFiles;
      vector<string>::iterator  it_pos;
      //@todo 已下載文件過濾
      for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); ) {
        string strTmp = *it_pos;
        if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判斷是否已下載過, 已下載則從列表刪除
          g_Log << TIME << "file:[" << *it_pos << "] found "<< END; //
          vecFiles.erase(it_pos++);
        }else
          it_pos++;
      }


正確: code2
      vector<string> vecFiles;
      vector<string>::iterator  it_pos;
      //@todo 已下載文件過濾
      for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); ) { 
        string strTmp = *it_pos;
        if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判斷是否已下載過, 已下載則從列表刪除
          g_Log << TIME << "file:[" << *it_pos << "] found "<< END; //
          it_pos = vecFiles.erase(it_pos);
        }else
          it_pos++;
      }

錯誤: code3
      vector<string> vecFiles;
      vector<string>::iterator  it_pos;
      //@todo 已下載文件過濾
      for (it_pos = vecFiles.begin(); it_pos != vecFiles.end(); it_pos++) { 
        string strTmp = *it_pos;
        if( objDownHis.checkHisList( strTmp.c_str() ) ){ //判斷是否已下載過, 已下載則從列表刪除
          g_Log << TIME << "file:[" << *it_pos << "] found "<< END; //
          vecFiles.erase(it_pos);
        }
      }


code3 錯誤的原因為, vecFiles.erase(it_pos); 當前的it_pos已經被刪除了, 再下一次循環的時候 it_pos++, 訪問非法內存..

然后回過頭來看code1, vecFiles.erase(it_pos++); 在當前的it_pos已經被刪除的時候, it_pos已經指向下一個位置了. 雖然這里邏輯上是錯誤的. 但是利用c語法的特性產生了一個正確的結果, 算是一個技巧. 不算是一門技術.

code2, it_pos = vecFiles.erase(it_pos); erase刪除的時候, 也返回了下一個指針的位置,我們將這個位置保留了, 所以這種做法也是正確的.


另外一個移植性比較好的做法是remove_if 和一個仿函數.

仿函數可以是:
struct check {
    check( Object * objDownHis ) : m_obj( objDownHis ) {}
    check( const check & c ) : m_obj( c.m_obj ) {}

    bool operator()(const string & s) const {
       if ( m_obj->checkHisList( s.c_str() ) {
            g_Log .........
            return true;
       }
       return false;
    }
    Object * m_obj;
};

vecFiles.erase( std::remove_if( vecFile.begin(), vecFile.end(), check( &objDownHis ) );


鳴謝p大, lancey, jackz 排名不分先后.. 全按交流時間順序...

posted on 2009-12-08 13:29 Khan 閱讀(6229) 評論(5)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺開發

評論

# re: STL Vector 的遍歷刪除.  回復  更多評論   

>code3 錯誤的原因為, vecFiles.erase(it_pos); 當前的it_pos已經被刪除
>了, 再下一次循環的時候 it_pos++, 訪問非法內存..

>然后回過頭來看code1, vecFiles.erase(it_pos++); 在當前的it_pos已經被
>刪除的時候, it_pos已經指向下一個位置了. 雖然這里邏輯上是錯誤的. 但是利
>用c語法的特性產生了一個正確的結果, 算是一個技巧. 不算是一門技術.

我對這種的說法有不同看法:
it_pos無所謂刪除不刪除,it_pos 的行為就像指針一樣,指針本身不會被刪除,被刪除的是指針指向的內容。我想樓主可能對迭代器失效的理解有偏差(建議在網上查一查相關的資料再看看)
我覺得,code1、2、3沒有什么本質區別,都有可能產生迭代器失效的問題。
一個原則:對vector只要做了刪除或是增加動作,就要示迭代器已經無效,必須重新從vector對象獲取新的迭代器的值,而不能用臨時變量、后綴自增等方法……
remove_if+erase的版本才是可讀性最好且沒什么問題的。

個人愚見,請博主笑納……



2009-12-08 18:43 | 唐風

# re: STL Vector 的遍歷刪除.  回復  更多評論   

傻傻的開發的
2009-12-10 10:23 | 夢芭莎內衣

# re: STL Vector 的遍歷刪除.  回復  更多評論   

code1的做法: 對非連續內存容器是可行的 對連續內存容器是不可取的
code1中會出現漏刪 而不是內存越界
2009-12-10 17:45 | yisa

# re: STL Vector 的遍歷刪除.  回復  更多評論   

@yisa

我用代碼驗證了下,的確是這樣:
歡迎去我的空間討論交流 hi.baidu.com/bmrs
1 /*
2 DATE: 2010.6.25
3 內容:關于vector的遍歷刪除
4 任何改變 vector 長度的操作都會使已存在的迭代器失效。例如,在調用 push_back 之后,就不能再信賴指向 vector 的迭代器的值了。
5 */
6 #include <iostream>
7 #include <vector>
8 #include <string>
9 #include <cstring>
10 using namespace std;
11
12 typedef vector<int> V;
13 typedef vector<int>::iterator VIT;
14 V v1;
15
16
17 int main()
18 {
19 for(int i=0; i<10; ++i)
20 v1.push_back(i);
21
22 VIT it = v1.begin();
23 VIT it2;
24 for(; it!=v1.end(); ++it)
25 cout<<*it<<" ";
26 cout<<endl<<v1.end()-v1.begin()<<endl; //vector容器的iterator是支持加減操作的,這在其他類型的迭代器中很少見
27 VIT it0 = v1.begin()+1; // 1
28 it2 = v1.begin()+3; // 3
29 VIT it3 = it2+1; // 4
30 cout<<"*it0="<<*it0<<" *it2="<<*it2<<" *it3="<<*it3<<endl;
31
32 for(it=v1.begin(); it!=v1.end(); ++it)
33 {
34 if(*it == 3)
35 {
36 cout<<"in for: before erase,*it="<<*it<<endl;
37 VIT tmp = it;
38 VIT r = v1.erase(it++);
39 cout<<"in for: after erase,*tmp="<<*tmp<<endl;
40 cout<<"in for: after it++ ,*it="<<*it<<endl;
41 cout<<"in for: after erase,*r="<<*r<<endl;
42 if(r == tmp)
43 cout<<"A random access iterator pointing to the new location of the element that followed the last element erased by the function call, which is the vector end if the operation erased the last element in the sequence."<<endl;
44 break;
45 }
46 }
47
48 cout<<"*it0="<<*it0<<" *it2="<<*it2<<" *it3="<<*it3<<endl;
49 return 0;
50 }
2010-06-25 16:04 | glq

# re: STL Vector 的遍歷刪除.  回復  更多評論   

的說法是的范德薩阿士發送到發送到大夫阿士大夫士大夫士大夫撒大撒的
2015-06-12 17:07 | 、開開
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲激情二区| 91久久视频| 性久久久久久久久久久久| 欧美日韩在线电影| aaa亚洲精品一二三区| 亚洲国产精品一区二区第四页av| 久久免费偷拍视频| 亚洲日本理论电影| 日韩视频一区二区三区| 国产精品麻豆成人av电影艾秋| 亚洲摸下面视频| 亚洲欧美在线免费| 在线观看av一区| 亚洲精品久久久一区二区三区| 欧美日韩免费观看一区二区三区| 亚洲免费在线观看视频| 欧美一区二区三区精品| 亚洲高清不卡在线观看| 日韩午夜激情av| 国产亚洲一区二区在线观看 | 国产精品羞羞答答| 久久精品欧美日韩| 欧美a级一区二区| 亚洲男女自偷自拍| 久久久精品一区二区三区| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲免费久久| 午夜欧美不卡精品aaaaa| 在线精品福利| 亚洲影视综合| 亚洲日本中文字幕区| 一区二区三区精品视频| 狠狠色丁香婷婷综合| 亚洲国产精品久久久久秋霞蜜臀| 国产精品高潮呻吟久久av无限| 久久午夜精品一区二区| 欧美激情综合网| 久久乐国产精品| 国产精品av免费在线观看| 美女脱光内衣内裤视频久久影院| 国产精品a级| 最新日韩欧美| 在线看日韩欧美| 亚洲在线免费| 亚洲一区二区三区精品动漫| 久久久亚洲一区| 久久九九热re6这里有精品| 欧美国产视频在线观看| 久久青青草综合| 国产精品久在线观看| 亚洲激情视频在线| 国语自产精品视频在线看8查询8| 99在线精品观看| 亚洲精品在线观看免费| 久久精品免费| 久久久噜噜噜久噜久久| 国产精品婷婷午夜在线观看| 亚洲精选视频免费看| 亚洲福利视频在线| 久久久人成影片一区二区三区| 欧美一级久久久| 国产精品福利影院| 亚洲免费电影在线| 日韩视频在线你懂得| 麻豆成人在线| 亚洲国产精品成人综合色在线婷婷| 国模 一区 二区 三区| 欧美在线国产精品| 久久久久久9| 精品成人国产在线观看男人呻吟| 午夜精品久久久久久久蜜桃app| 亚洲摸下面视频| 国产精品一二三四| 午夜精品网站| 蜜臀av国产精品久久久久| 精东粉嫩av免费一区二区三区| 欧美在线日韩| 欧美成人亚洲成人日韩成人| 亚洲成色www久久网站| 久久综合伊人77777尤物| 欧美激情精品久久久久久免费印度| 亚洲电影免费在线| 欧美二区不卡| 99亚洲一区二区| 久久国产99| 亚洲国产成人不卡| 欧美精品一区二区三区一线天视频 | 六月天综合网| 亚洲精品一区二区在线观看| 欧美日韩和欧美的一区二区| 中文av字幕一区| 久久久久久久久久久成人| 在线成人激情黄色| 欧美激情综合| 午夜精品福利视频| 欧美激情精品久久久久久久变态| 日韩一区二区久久| 国产伦精品免费视频| 久久免费国产精品| 日韩一级大片在线| 欧美在线播放一区| 亚洲精品网址在线观看| 国产精品久久久久秋霞鲁丝| 久久蜜桃精品| 亚洲色图综合久久| 欧美成年人在线观看| 亚洲午夜极品| 亚洲高清av在线| 国产精品日韩一区| 欧美国产日本| 久久精品首页| 亚洲少妇在线| 亚洲高清不卡| 久久久久久夜| 亚洲欧美日韩综合aⅴ视频| 在线精品一区二区| 国产精品实拍| 欧美精品福利| 老色批av在线精品| 欧美一区二区国产| 一本一本久久a久久精品综合妖精| 老**午夜毛片一区二区三区| 亚洲欧美高清| 日韩午夜在线| 亚洲国产精品va| 国产在线观看一区| 国产精品亚洲综合色区韩国| 欧美激情影院| 欧美黑人在线播放| 久久久久国内| 久久国产精品色婷婷| 亚洲欧美日韩国产中文| 日韩一区二区电影网| 亚洲成色777777在线观看影院 | 国内精品久久久久久 | 国产精品久久久久久久午夜片| 欧美成人亚洲| 免费在线成人| 久色成人在线| 麻豆精品在线视频| 久久成年人视频| 欧美专区亚洲专区| 久久爱另类一区二区小说| 午夜精品久久久久久久久久久| 宅男噜噜噜66国产日韩在线观看| 亚洲精品久久久久久久久久久| 亚洲成色www久久网站| 亚洲成在线观看| 亚洲高清一二三区| 91久久极品少妇xxxxⅹ软件| 亚洲国产成人久久综合| 亚洲国产精品成人| 亚洲乱码国产乱码精品精可以看 | 欧美一区=区| 午夜在线视频一区二区区别| 亚洲与欧洲av电影| 欧美一区二区三区免费视频| 午夜精品在线视频| 久久精品成人| 免费观看国产成人| 欧美a级片网站| 亚洲日本中文字幕| 亚洲一区二区三区久久| 午夜精品亚洲一区二区三区嫩草| 欧美在线一二三四区| 久久免费视频一区| 欧美精品成人91久久久久久久| 欧美日韩国内| 国产欧美一区二区三区在线看蜜臀 | 久久伊人一区二区| 欧美精彩视频一区二区三区| 欧美片第一页| 国产欧美亚洲视频| 亚洲国产精品va在看黑人| 宅男噜噜噜66国产日韩在线观看| 宅男在线国产精品| 久久久激情视频| 亚洲国产一区二区精品专区| 一本久久综合亚洲鲁鲁五月天| 欧美亚洲视频在线观看| 久久综合色88| 国产精品视频99| 亚洲黄色免费网站| 性欧美18~19sex高清播放| 免费在线亚洲欧美| 中文亚洲字幕| 美女视频一区免费观看| 国产精品日本精品| 91久久线看在观草草青青| 先锋影音久久久| 亚洲第一伊人| 午夜精品一区二区三区电影天堂| 欧美国产日韩一二三区| 国产在线成人| 中文一区字幕| 亚洲电影免费在线| 久久aⅴ乱码一区二区三区| 欧美日本在线播放| 亚洲激情视频网站| 久久久999|