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

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

路漫漫,長修遠(yuǎn),我們不能沒有錢
隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
數(shù)據(jù)加載中……

STL Vector 的遍歷刪除.

Vector 其實(shí)就類似動(dòng)態(tài)數(shù)組. 事先分配好一定量的內(nèi)存. 當(dāng)需要的內(nèi)存值大于某個(gè)閥值. 就重新申請(qǐng)內(nèi)存. 重新分配. 當(dāng)小于某個(gè)閥值, 也會(huì)導(dǎo)致重新分配.(自動(dòng)收縮部分, stl沒有明確規(guī)定, 有些庫實(shí)現(xiàn)了)

正確: 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++;
      }

錯(cuò)誤: 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 錯(cuò)誤的原因?yàn)? vecFiles.erase(it_pos); 當(dāng)前的it_pos已經(jīng)被刪除了, 再下一次循環(huán)的時(shí)候 it_pos++, 訪問非法內(nèi)存..

然后回過頭來看code1, vecFiles.erase(it_pos++); 在當(dāng)前的it_pos已經(jīng)被刪除的時(shí)候, it_pos已經(jīng)指向下一個(gè)位置了. 雖然這里邏輯上是錯(cuò)誤的. 但是利用c語法的特性產(chǎn)生了一個(gè)正確的結(jié)果, 算是一個(gè)技巧. 不算是一門技術(shù).

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


另外一個(gè)移植性比較好的做法是remove_if 和一個(gè)仿函數(shù).

仿函數(shù)可以是:
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 排名不分先后.. 全按交流時(shí)間順序...

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

評(píng)論

# re: STL Vector 的遍歷刪除.  回復(fù)  更多評(píng)論   

>code3 錯(cuò)誤的原因?yàn)? vecFiles.erase(it_pos); 當(dāng)前的it_pos已經(jīng)被刪除
>了, 再下一次循環(huán)的時(shí)候 it_pos++, 訪問非法內(nèi)存..

>然后回過頭來看code1, vecFiles.erase(it_pos++); 在當(dāng)前的it_pos已經(jīng)被
>刪除的時(shí)候, it_pos已經(jīng)指向下一個(gè)位置了. 雖然這里邏輯上是錯(cuò)誤的. 但是利
>用c語法的特性產(chǎn)生了一個(gè)正確的結(jié)果, 算是一個(gè)技巧. 不算是一門技術(shù).

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

個(gè)人愚見,請(qǐng)博主笑納……



2009-12-08 18:43 | 唐風(fēng)

# re: STL Vector 的遍歷刪除.  回復(fù)  更多評(píng)論   

傻傻的開發(fā)的
2009-12-10 10:23 | 夢芭莎內(nèi)衣

# re: STL Vector 的遍歷刪除.  回復(fù)  更多評(píng)論   

code1的做法: 對(duì)非連續(xù)內(nèi)存容器是可行的 對(duì)連續(xù)內(nèi)存容器是不可取的
code1中會(huì)出現(xiàn)漏刪 而不是內(nèi)存越界
2009-12-10 17:45 | yisa

# re: STL Vector 的遍歷刪除.  回復(fù)  更多評(píng)論   

@yisa

我用代碼驗(yàn)證了下,的確是這樣:
歡迎去我的空間討論交流 hi.baidu.com/bmrs
1 /*
2 DATE: 2010.6.25
3 內(nèi)容:關(guān)于vector的遍歷刪除
4 任何改變 vector 長度的操作都會(huì)使已存在的迭代器失效。例如,在調(diào)用 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 的遍歷刪除.  回復(fù)  更多評(píng)論   

的說法是的范德薩阿士發(fā)送到發(fā)送到大夫阿士大夫士大夫士大夫撒大撒的
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>
            欧美一区二区视频免费观看| 亚洲欧美日韩国产中文 | 亚洲视频精选在线| 亚洲免费播放| 国产精品福利在线观看网址| 亚洲欧美日韩国产综合| 午夜精品一区二区三区在线播放 | 亚洲欧美在线磁力| 午夜国产不卡在线观看视频| 国产一区二区黄| 欧美.日韩.国产.一区.二区| 欧美成人官网二区| 亚洲视频 欧洲视频| 亚洲一区二区久久| 精品96久久久久久中文字幕无| 免费在线看成人av| 欧美日韩国产不卡在线看| 性欧美长视频| 久久成人精品电影| 又紧又大又爽精品一区二区| 亚洲欧洲综合另类在线| 国产精品久久久久久久久久妞妞| 久久精品在线观看| 欧美多人爱爱视频网站| 亚洲欧美中日韩| 久久久久久久网站| 在线午夜精品| 欧美一区二区成人6969| 激情久久一区| 日韩天堂在线观看| 国产偷国产偷精品高清尤物| 亚洲第一视频| 国产精品一区二区你懂的| 欧美成人乱码一区二区三区| 欧美色视频日本高清在线观看| 久久久久久久久久久久久9999| 欧美国产日韩一二三区| 欧美一级午夜免费电影| 免费观看欧美在线视频的网站| 亚洲综合99| 久久一区二区三区四区| 亚洲综合色在线| 另类天堂av| 欧美一区二区三区播放老司机| 麻豆精品在线视频| 欧美一区二区三区精品| 欧美激情亚洲一区| 久久精品国产亚洲aⅴ| 欧美精品免费播放| 久久视频精品在线| 欧美精品在线极品| 久久免费一区| 欧美系列电影免费观看| 欧美高清你懂得| 国产区精品视频| 99精品99| 亚洲人成毛片在线播放| 欧美一区二区啪啪| 亚洲一区二区三区在线视频| 免费观看日韩| 久久人人九九| 国产精品区一区二区三区| 亚洲欧洲在线播放| 在线观看不卡av| 午夜精品久久久| 亚洲一区二区免费在线| 欧美福利电影在线观看| 久久综合久久综合久久综合| 国产精品久久久久一区| 欧美激情小视频| 国内一区二区在线视频观看| 日韩天堂在线视频| 亚洲黄页一区| 久久久国产视频91| 久久riav二区三区| 国产精品久久国产愉拍| 亚洲日本欧美| 亚洲国产色一区| 久久久www成人免费无遮挡大片| 欧美一区二区免费| 欧美午夜国产| 日韩视频―中文字幕| 亚洲狼人综合| 老鸭窝91久久精品色噜噜导演| 久久精品国产999大香线蕉| 国产精品国产精品| 99精品99| 亚洲一区bb| 欧美区二区三区| 91久久精品久久国产性色也91| 亚洲黄色av一区| 久久综合伊人| 欧美成人a∨高清免费观看| 韩国三级在线一区| 欧美与黑人午夜性猛交久久久| 欧美一区二区福利在线| 国产精品亚洲а∨天堂免在线| 一区二区久久| 亚洲影音一区| 国产精品高精视频免费| 一本一道久久综合狠狠老精东影业| 一本一本久久a久久精品综合麻豆| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美成人精品h版在线观看| 在线播放不卡| 久热综合在线亚洲精品| 麻豆精品在线视频| 在线精品国产成人综合| 鲁大师成人一区二区三区| 久久综合狠狠综合久久综青草| 国产一区二区三区高清播放| 欧美一级淫片aaaaaaa视频| 久久久午夜电影| 一区二区亚洲| 久久人人爽人人爽| 免费视频久久| 91久久久久| 欧美电影免费观看大全| 亚洲日本视频| 亚洲先锋成人| 国产精品色午夜在线观看| 午夜久久久久久| 久久亚洲精品一区| 亚洲国产日韩一级| 欧美日本免费| 国产精品久久久一区二区| 久久久噜噜噜久噜久久| 一区二区在线免费观看| 久久在线免费| 亚洲精品美女久久久久| 亚洲一区日韩| 国产丝袜一区二区| 久久影院亚洲| 亚洲精品国产无天堂网2021| 亚洲午夜在线观看视频在线| 国产日韩欧美黄色| 久久久久久亚洲精品中文字幕 | 久久精品国产精品亚洲精品| 欧美11—12娇小xxxx| 国产精品日韩欧美一区二区三区| 欧美一区二区三区免费观看| 农夫在线精品视频免费观看| 99av国产精品欲麻豆| 国产精品白丝jk黑袜喷水| 欧美亚洲在线视频| 欧美激情第六页| 亚洲午夜精品久久久久久浪潮| 国产日产欧美a一级在线| 国产精品影片在线观看| 日韩视频一区二区在线观看| 欧美一级视频一区二区| 亚洲国产精品视频| 欧美日韩在线播放一区二区| 欧美亚洲视频在线观看| 亚洲电影免费在线观看| 亚洲影视九九影院在线观看| 一区二区三区在线观看国产| 欧美日本精品| 久久se精品一区二区| 亚洲国产综合91精品麻豆| 香蕉久久精品日日躁夜夜躁| 在线播放一区| 国产精品高潮呻吟久久| 久热精品视频在线免费观看| 国产精品99久久久久久白浆小说| 乱人伦精品视频在线观看| 中国成人黄色视屏| 欧美激情一区二区三级高清视频 | 日韩午夜黄色| 国产热re99久久6国产精品| 欧美a级一区| 亚洲欧美国产高清| 亚洲国产一区二区在线| 久久精品国产第一区二区三区最新章节 | 黄色精品网站| 欧美日韩免费一区| 久久久亚洲高清| 亚洲婷婷国产精品电影人久久| 欧美华人在线视频| 欧美在线亚洲在线| 一区二区日韩欧美| 激情懂色av一区av二区av| 国产精品国产三级国产aⅴ入口| 老司机免费视频一区二区三区 | 亚洲国产免费看| 另类天堂视频在线观看| 宅男噜噜噜66国产日韩在线观看| 黄色av日韩| 国产精品你懂的在线| 亚洲欧美综合国产精品一区| 亚洲日本va午夜在线电影| 久久亚洲私人国产精品va| 亚洲欧美视频在线观看视频| 亚洲精品视频一区| 激情成人在线视频| 国产欧美二区| 国产精品vip| 欧美精品一区二区高清在线观看| 久久精品官网| 午夜精品久久久|