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

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

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

STL Vector 的遍歷刪除.

Vector 其實就類似動態(tài)數(shù)組. 事先分配好一定量的內(nèi)存. 當(dāng)需要的內(nèi)存值大于某個閥值. 就重新申請內(nèi)存. 重新分配. 當(dāng)小于某個閥值, 也會導(dǎo)致重新分配.(自動收縮部分, stl沒有明確規(guī)定, 有些庫實現(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++;
      }

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

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

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


另外一個移植性比較好的做法是remove_if 和一個仿函數(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 排名不分先后.. 全按交流時間順序...

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

評論

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

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

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

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

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



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

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

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

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

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

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

@yisa

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

的說法是的范德薩阿士發(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>
            一区二区三区色| 久久久99久久精品女同性| 久久久久久久成人| 久久婷婷丁香| 亚洲激情在线视频| 久久久久国产精品午夜一区| 亚洲另类在线视频| 乱人伦精品视频在线观看| 久久视频国产精品免费视频在线| 久久久免费av| 国产精品免费一区二区三区观看| 国产乱码精品1区2区3区| 国内精品视频在线观看| 黑人一区二区三区四区五区| 亚洲大片免费看| 亚洲欧美国产日韩天堂区| 久久精品99国产精品酒店日本| 亚洲人屁股眼子交8| 久久综合网络一区二区| 亚洲精品一区二区三区在线观看 | 亚洲一区二区视频在线| 亚洲特级片在线| 久久永久免费| 国产精品视频| 亚洲精品欧美专区| 欧美一区二区三区在线看| 欧美激情精品久久久六区热门 | 久久久久国色av免费观看性色| 亚洲综合99| 亚洲欧美一区二区原创| 国产精品私人影院| 亚洲午夜一区| 免费成人黄色片| 亚洲电影免费观看高清完整版| 久久国产高清| 欧美激情va永久在线播放| 一本一本久久a久久精品综合麻豆| 欧美日韩精品三区| 亚洲精品久久嫩草网站秘色 | 欧美成年人视频网站| 最新国产精品拍自在线播放| 亚洲视频一区二区免费在线观看| 国产精品www网站| 久久精品视频播放| 亚洲调教视频在线观看| 欧美高清视频在线| 香蕉成人伊视频在线观看 | 久久久久久久久久码影片| 伊人色综合久久天天| 欧美日韩伦理在线| 午夜日韩av| 99re在线精品| 欧美激情一区二区三区在线| 欧美在线免费观看视频| 亚洲免费影视第一页| 一本一本久久| 一区二区三区黄色| 亚洲精品乱码| 亚洲精品乱码久久久久久蜜桃91| 黄色成人精品网站| 国产一区日韩一区| 亚洲精品视频在线观看网站 | 久久久国产精彩视频美女艺术照福利| 亚洲精品免费在线播放| 亚洲第一二三四五区| 在线免费观看日本欧美| 国外成人网址| 韩国女主播一区| 一区二区三区亚洲| 在线看日韩av| 亚洲国产成人久久综合一区| 激情小说另类小说亚洲欧美| 国产一区香蕉久久| 亚洲欧洲一区| 亚洲一区二区三区四区在线观看| 亚洲精品乱码久久久久久| 亚洲人成毛片在线播放女女| 99精品99| 欧美自拍偷拍| 麻豆精品在线视频| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 男人的天堂成人在线| 快射av在线播放一区| 欧美国产成人精品| 亚洲特级片在线| 老司机午夜免费精品视频| 国产精品三区www17con| 亚洲卡通欧美制服中文| 久久九九有精品国产23| 91久久香蕉国产日韩欧美9色| 亚洲欧美一区二区三区在线| 欧美系列一区| 亚洲一区二区三| 免费永久网站黄欧美| 一区二区电影免费在线观看| 久久国产手机看片| 欧美.日韩.国产.一区.二区| 亚洲欧洲av一区二区| 国产精品va在线播放我和闺蜜| 91久久在线播放| 久久伊人精品天天| 久久久久看片| 1000部国产精品成人观看| 久久久噜噜噜久久中文字幕色伊伊| 91久久嫩草影院一区二区| 久久精品视频网| 一区在线免费观看| 久久综合色88| 欧美91精品| 亚洲人成网站777色婷婷| 亚洲精品国产精品国自产观看| 欧美精品亚洲精品| 亚洲欧美激情视频| 欧美一区二区三区久久精品茉莉花| 国产精品jizz在线观看美国| 小处雏高清一区二区三区| 久久国产精品久久w女人spa| 亚洲欧洲日本在线| 亚洲欧美日韩精品| 亚洲电影自拍| 最新成人在线| 国产一区二区精品久久91| 欧美成人精品三级在线观看| 欧美日韩在线影院| 蜜臀va亚洲va欧美va天堂| 免费在线亚洲欧美| 久久精品卡一| 欧美凹凸一区二区三区视频| 亚洲欧美日韩另类精品一区二区三区 | 欧美福利电影网| 香蕉久久国产| 欧美精选一区| 久久亚洲春色中文字幕久久久 | 国产精品你懂的在线欣赏| 久久成人精品无人区| 欧美色道久久88综合亚洲精品| 国产精品午夜av在线| 免费成人性网站| 国产欧美午夜| 一区二区三区 在线观看视频| 国内激情久久| 久久夜色精品国产噜噜av| 欧美一区二区视频97| 欧美日韩在线播放三区| 一区二区欧美激情| 一区二区电影免费观看| 欧美日韩午夜精品| 亚洲欧洲在线看| 亚洲另类春色国产| 欧美激情国产精品| 亚洲国产精品国自产拍av秋霞| 国产一区二区三区在线观看免费视频 | 在线观看一区二区视频| 欧美在线视频在线播放完整版免费观看| 亚洲蜜桃精久久久久久久| 免费成人黄色片| 亚洲激情另类| 欧美一区二区免费| 好吊一区二区三区| 欧美freesex8一10精品| 亚洲国产精品一区二区久| 日韩香蕉视频| 国产精品自拍三区| 欧美韩日亚洲| 欧美一级片在线播放| 久久夜精品va视频免费观看| 亚洲日韩第九十九页| 国产精品热久久久久夜色精品三区| 亚洲一区精品视频| 欧美高清在线视频| 羞羞漫画18久久大片| 国产热re99久久6国产精品| 久久野战av| 久久综合久久综合这里只有精品| 亚洲欧洲一区二区三区在线观看| 亚洲综合丁香| 亚洲国产老妈| 欧美区高清在线| 狠狠做深爱婷婷久久综合一区| 欧美一区二区三区在线看| 国产精品视频yy9299一区| 欧美在线视频一区二区| 久久久国产精品一区二区中文 | 久久久久久久国产| 亚洲国产精品久久| 亚洲永久网站| 亚洲国产精品成人一区二区| 国产精品福利在线| 免费欧美视频| 久久精品在线观看| 亚洲欧美乱综合| 99精品99| 91久久综合| 欧美高清视频在线观看| 久久成人精品视频| 亚洲欧美日韩一区在线观看| 亚洲国产精品va在线看黑人动漫 | 亚洲欧美日韩一区| 在线精品视频免费观看| 国产乱码精品一区二区三区av|