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

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

路漫漫,長(zhǎng)修遠(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 閱讀(6217) 評(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 | 夢(mèng)芭莎內(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 長(zhǎng)度的操作都會(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>
            亚洲香蕉网站| 亚洲欧美日韩综合aⅴ视频| 久久精品日韩欧美| 亚洲一区二区在线| 亚洲综合日本| 久久成人羞羞网站| 久久综合999| 日韩视频一区二区三区| 亚洲美女精品久久| 久久久欧美一区二区| 久久九九国产| 亚洲国产mv| 亚洲国产精选| 亚洲欧洲视频在线| 99国产麻豆精品| 午夜精品久久久久久99热软件 | 久久久精品一品道一区| 欧美暴力喷水在线| 国产精品久久久久国产a级| 国产乱码精品| 亚洲精品乱码久久久久| 午夜国产精品视频免费体验区| 久久天堂精品| av不卡免费看| 免费日韩一区二区| 国产精品自拍视频| 亚洲国产精品视频| 欧美一级一区| 亚洲欧洲一二三| 久久国产成人| 欧美视频在线观看 亚洲欧| 蜜桃久久精品乱码一区二区| 国产精品vip| 亚洲人成网站色ww在线| 欧美一级专区| 亚洲美女视频网| 久久综合色一综合色88| 国产精品区一区二区三| 亚洲伦伦在线| 欧美~级网站不卡| 亚洲欧美日韩精品久久久| 欧美激情一区在线观看| 欧美激情精品久久久久久大尺度 | 欧美国产一区二区| 国产一区二三区| 午夜精品一区二区三区四区| 亚洲国产mv| 久久中文字幕一区二区三区| 韩国三级电影久久久久久| 午夜精品免费| 一本在线高清不卡dvd| 欧美国产丝袜视频| 亚洲三级免费| 亚洲国产婷婷| 欧美69视频| 亚洲精品国产品国语在线app| 久久一区二区精品| 欧美在线免费观看亚洲| 国产日韩精品入口| 欧美在线啊v| 亚洲欧美国产va在线影院| 国产精品色一区二区三区| 亚洲资源在线观看| 亚洲一区二区三区视频| 国产精品欧美一区二区三区奶水| 亚洲素人在线| 亚洲一区二三| 国产乱码精品一区二区三区av| 午夜在线一区二区| 亚洲欧美激情在线视频| 一区二区三区鲁丝不卡| 国产精品成人一区二区| 亚洲欧美第一页| 午夜精品久久久久影视| 国产区日韩欧美| 久久夜色精品国产欧美乱极品| 久久综合99re88久久爱| 亚洲精品乱码久久久久久久久 | 亚洲国产美女久久久久| 欧美国产一区二区三区激情无套| 欧美成va人片在线观看| 日韩一区二区免费高清| 中日韩美女免费视频网址在线观看 | 一卡二卡3卡四卡高清精品视频| 亚洲精品美女在线观看| 国产精品久久久久久久久借妻| 欧美永久精品| 免费成人av在线| 亚洲自拍偷拍视频| 性色一区二区| 99re在线精品| 亚洲欧美日韩一区在线| 亚洲高清视频在线| 在线午夜精品自拍| 1000部精品久久久久久久久| 亚洲精品乱码久久久久久按摩观| 国产伦精品一区二区三区免费| 欧美成人免费在线观看| 欧美性一区二区| 欧美不卡激情三级在线观看| 欧美午夜精品电影| 欧美二区乱c少妇| 国产精品影音先锋| 亚洲国产日韩欧美综合久久| 国产亚洲电影| 99热在线精品观看| 在线观看国产欧美| 亚洲欧美日韩中文视频| 一本色道婷婷久久欧美| 久久激情视频久久| 亚洲主播在线| 欧美另类变人与禽xxxxx| 久久一区二区三区四区| 国产精品永久免费观看| 亚洲三级影院| 亚洲激情av| 久久久久综合一区二区三区| 新狼窝色av性久久久久久| 欧美区一区二区三区| 久久综合久久美利坚合众国| 国产精品视频免费一区| 99亚洲一区二区| 亚洲麻豆av| 欧美xxxx在线观看| 亚洲黄页视频免费观看| 久久av资源网| 久久精品综合网| 国产日韩欧美在线看| 中文亚洲免费| 亚洲一区久久久| 欧美特黄一级大片| 亚洲九九精品| 亚洲一区二区三区四区在线观看| 欧美另类99xxxxx| 亚洲精品黄网在线观看| 91久久精品一区二区三区| 久久亚洲精品一区二区| 久久在线视频在线| 一区二区三区在线看| 久久国产精品黑丝| 久久久久久电影| 韩国av一区二区| 久久偷看各类wc女厕嘘嘘偷窃| 美女福利精品视频| 亚洲国产成人tv| 欧美成人免费va影院高清| 欧美激情一区二区三区成人| 亚洲黄色一区二区三区| 欧美成人激情视频| 亚洲精品久久| 亚洲综合色自拍一区| 国产亚洲在线观看| 久久影视三级福利片| 亚洲国产成人午夜在线一区| 日韩午夜av| 国产精品美女久久久久久免费| 午夜综合激情| 免费成人性网站| 日韩一级裸体免费视频| 国产精品黄视频| 欧美一区二区三区免费视| 久久综合给合| 99热这里只有精品8| 国产精品人成在线观看免费| 久久国产一区| 亚洲三级视频| 欧美一区二区在线看| 在线看片欧美| 欧美午夜剧场| 久久精品五月| 亚洲欧洲日产国产综合网| 亚洲欧美日韩高清| 在线观看成人av| 欧美午夜视频网站| 久久精品亚洲精品| 亚洲精品国久久99热| 欧美在线观看你懂的| 亚洲激情国产| 国产日韩欧美电影在线观看| 欧美二区在线| 久久国产精品黑丝| 一区二区三区 在线观看视频| 久久人人97超碰人人澡爱香蕉| 亚洲美女av网站| 国际精品欧美精品| 欧美视频在线看| 麻豆91精品91久久久的内涵| 亚洲欧美日韩国产一区| 亚洲精品久久久久久久久久久久 | 亚洲精品久久久久久久久久久久久 | 久久成人精品视频| 一本色道久久综合亚洲精品高清| 蜜桃av久久久亚洲精品| 国产在线观看精品一区二区三区| 欧美精品aa| 美女黄色成人网| 久久本道综合色狠狠五月| 日韩午夜免费视频| 亚洲国产合集| 免费中文字幕日韩欧美|