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

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 閱讀(6219) 評論(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>
            av成人免费在线| 国产老女人精品毛片久久| 欧美超级免费视 在线| 亚洲一区二区三区午夜| 亚洲一区二区三区高清不卡| 亚洲精品激情| 亚洲综合日韩| 久久久久久久成人| 免费欧美电影| 亚洲一区在线直播| 亚洲一区二区三区色| 一区二区三区免费观看| 欧美一区二区三区在线观看| 久久高清免费观看| 免播放器亚洲| 一区二区三区四区五区在线| 亚洲欧美区自拍先锋| 久久人91精品久久久久久不卡| 免费看黄裸体一级大秀欧美| 欧美日韩影院| 亚洲电影中文字幕| 久久成人免费电影| 99国产精品99久久久久久粉嫩| 亚洲欧美色婷婷| 欧美国产日韩a欧美在线观看| 国产精品久久久久久久久久直播 | 性做久久久久久久免费看| aⅴ色国产欧美| 欧美专区一区二区三区| 欧美高清在线播放| 国产精品视频xxxx| 亚洲电影自拍| 久久精品99国产精品日本| 欧美福利视频网站| 亚洲午夜精品网| 久久国产加勒比精品无码| 久久在线免费| 欧美午夜片在线观看| 亚洲激情六月丁香| 欧美国产第一页| 美女主播一区| 看片网站欧美日韩| 久久久久一本一区二区青青蜜月| 国产精品福利在线| 翔田千里一区二区| 久久久www| 亚洲人成免费| 一本一本久久| 国产亚洲一区在线| 你懂的视频欧美| 欧美视频官网| 久久中文在线| 欧美屁股在线| 久久裸体视频| 欧美私人网站| 亚洲国产99| 国产欧美一区二区精品婷婷 | 欧美mv日韩mv亚洲| 久久综合精品国产一区二区三区| 99视频超级精品| 欧美一区在线看| 亚洲综合三区| 欧美日韩精品国产| 欧美成年网站| 黄色精品一区| 午夜视频在线观看一区| 日韩视频一区二区| 激情六月婷婷综合| 亚洲精品影院| 麻豆久久久9性大片| 久久久精品2019中文字幕神马| 欧美在线日韩| 亚洲美女在线视频| 亚洲欧美日韩国产综合在线| 欧美一区二区视频免费观看| 91久久在线观看| 亚洲日本电影| 欧美美女bbbb| 影音先锋中文字幕一区| 欧美影院视频| 亚洲一区图片| 欧美日韩成人在线观看| 性欧美长视频| 日韩亚洲视频| 一区二区日韩免费看| 国内精品久久久久影院薰衣草| 亚洲手机在线| 欧美成人午夜激情视频| 亚洲精品女人| 国产视频久久久久| 免费看黄裸体一级大秀欧美| 亚洲福利视频一区| 在线视频亚洲一区| 好看的日韩视频| 欧美精品在线免费播放| 蜜臀av性久久久久蜜臀aⅴ| 国产一区二区在线免费观看| 亚洲免费一级电影| 久久精品一区二区| 亚洲美女尤物影院| 国产亚洲欧美一区二区| 欧美 日韩 国产 一区| 亚洲一区在线观看视频 | 在线亚洲高清视频| 激情婷婷欧美| 国产综合视频| 国产视频在线观看一区二区| 久久狠狠亚洲综合| 亚洲国产清纯| 国产在线精品成人一区二区三区| 欧美亚州一区二区三区 | 欧美精品九九99久久| 亚洲一区免费看| 一区二区三区四区五区视频| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲欧美欧美一区二区三区| 一区二区三区精品国产| 一本色道婷婷久久欧美| 亚洲一区网站| 性久久久久久久久久久久| 亚洲网址在线| 久久只有精品| 亚洲精品日本| 亚洲一区www| 亚洲一区二区三区四区视频| 亚洲宅男天堂在线观看无病毒| 亚洲亚洲精品三区日韩精品在线视频| 一区二区毛片| 午夜天堂精品久久久久 | 欧美在线一二三四区| 欧美在线高清视频| 欧美黑人在线播放| 亚洲小说春色综合另类电影| 久久久成人网| 欧美另类69精品久久久久9999| 欧美韩国一区| 国产一区二区电影在线观看 | 国产精品青草久久| 91久久精品国产91性色| 欧美中文字幕| 一本色道久久综合亚洲精品按摩 | 久久视频一区二区| 国产精品二区三区四区| 亚洲国产成人午夜在线一区| 亚洲欧美在线视频观看| 91久久线看在观草草青青| 欧美在线免费播放| 国产精品日韩欧美一区| 亚洲深夜福利视频| 亚洲黄色性网站| 欧美福利影院| 亚洲精品裸体| 亚洲老板91色精品久久| 欧美好骚综合网| 日韩视频在线观看免费| 亚洲电影自拍| 欧美日韩国产成人在线观看| 亚洲伦理中文字幕| 一本久道久久综合婷婷鲸鱼| 男同欧美伦乱| 欧美激情一区在线| 一区二区激情| 国产精品一卡二卡| 欧美中文字幕| 免费不卡在线观看| 亚洲视频成人| 久久婷婷麻豆| 欧美一区二区三区在| 蜜臀av国产精品久久久久| 亚洲午夜激情网页| 久久手机精品视频| 亚洲一区二区在线视频| 久久国产毛片| 久久狠狠婷婷| 国产精品日产欧美久久久久| 欧美激情视频在线播放| 国产一区二区三区在线观看精品 | 久久一区激情| 国产精品色午夜在线观看| 亚洲激情校园春色| 99精品视频网| 葵司免费一区二区三区四区五区| 欧美日韩在线大尺度| 亚洲区第一页| 一区二区三区成人| 欧美韩日一区二区| 欧美r片在线| 91久久精品日日躁夜夜躁国产| 亚洲高清一二三区| 亚洲久久一区| 国产伦精品免费视频 | 欧美中文字幕在线播放| 欧美成人日韩| 一本久久综合亚洲鲁鲁| 欧美一区二区三区婷婷月色 | 亚洲字幕在线观看| 欧美久久影院| 久久亚洲综合色| 欧美性做爰毛片| 午夜精品剧场|