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

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

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

STL Vector 的遍歷刪除.

Vector 其實就類似動態(tài)數(shù)組. 事先分配好一定量的內存. 當需要的內存值大于某個閥值. 就重新申請內存. 重新分配. 當小于某個閥值, 也會導致重新分配.(自動收縮部分, 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); 當前的it_pos已經被刪除了, 再下一次循環(huán)的時候 it_pos++, 訪問非法內存..

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

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 閱讀(6219) 評論(5)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺開發(fā)

評論

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

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

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

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

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



2009-12-08 18:43 | 唐風

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

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

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

code1的做法: 對非連續(xù)內存容器是可行的 對連續(xù)內存容器是不可取的
code1中會出現(xiàn)漏刪 而不是內存越界
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 的遍歷刪除.  回復  更多評論   

的說法是的范德薩阿士發(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>
            在线观看一区| 女女同性女同一区二区三区91| 最新国产拍偷乱拍精品| 国产麻豆91精品| 国产日韩精品在线播放| 国产一区日韩欧美| 亚洲国产成人久久综合| 亚洲毛片av| 欧美一进一出视频| 老司机精品导航| 亚洲激情国产| 亚洲精品一区久久久久久| 亚洲午夜未删减在线观看| 欧美专区日韩专区| 欧美日韩国产高清视频| 国产日韩欧美综合精品| 亚洲人久久久| 久久精品人人做人人综合| 久久国产精彩视频| 欧美二区不卡| 亚洲字幕一区二区| 欧美va亚洲va日韩∨a综合色| 亚洲国产中文字幕在线观看| 一区二区三区视频在线播放| 久久久亚洲影院你懂的| 国产精品h在线观看| 在线国产精品一区| 亚洲品质自拍| 亚洲欧洲在线视频| 欧美在线观看视频一区二区三区| 亚洲成人原创| 亚洲一区二区免费| 女人色偷偷aa久久天堂| 日韩网站在线| 麻豆乱码国产一区二区三区| 国产精品夜夜夜| 一本大道久久a久久综合婷婷| 亚洲国产欧美一区二区三区同亚洲| 国产精品一区一区三区| 在线观看亚洲视频| 亚洲一区视频在线| 亚洲国产高清视频| 久久精品麻豆| 国产精品一区久久| 亚洲欧美bt| 日韩亚洲欧美成人一区| 免费高清在线视频一区·| 国产亚洲激情| 欧美综合第一页| 亚洲欧美激情诱惑| 国产精品一区二区三区免费观看| 国产亚洲精品美女| 亚洲深夜激情| 亚洲日本欧美在线| 欧美久色视频| 一个色综合av| 亚洲老司机av| 欧美视频在线观看视频极品| av成人手机在线| 亚洲黄色在线观看| 欧美久色视频| 亚洲已满18点击进入久久| 日韩视频精品在线观看| 欧美色大人视频| 亚洲图片欧洲图片日韩av| 亚洲肉体裸体xxxx137| 欧美精品亚洲一区二区在线播放| 国产精品激情偷乱一区二区∴| 国产精品久久久对白| 9i看片成人免费高清| 一区二区欧美激情| 国产模特精品视频久久久久| 欧美中在线观看| 久久久久久亚洲精品中文字幕| 欧美日韩亚洲天堂| 亚洲一区欧美一区| 欧美一区二区在线看| 国产一区二区三区高清播放| 免播放器亚洲| 欧美日韩精品国产| 亚洲欧美精品| 久久久国际精品| 一级日韩一区在线观看| 亚洲中无吗在线| 亚洲高清中文字幕| avtt综合网| 激情另类综合| 欧美日韩成人一区| 一区二区三区四区五区视频 | 国产精品99久久久久久白浆小说 | 久久久水蜜桃| 久久九九99| 日韩一级在线观看| 亚洲欧美日韩国产一区| 在线观看视频一区| 宅男噜噜噜66一区二区| 在线观看视频一区二区| 99伊人成综合| 在线看国产一区| 亚洲视频大全| 亚洲激情成人在线| 亚洲欧美日韩精品久久久久| 91久久久久| 性欧美xxxx大乳国产app| 亚洲久久视频| 久久久久久高潮国产精品视| 中文av字幕一区| 玖玖玖国产精品| 欧美一区二区精品久久911| 欧美福利一区| 久久综合久久综合久久| 国产精品视频999| 99热这里只有精品8| 亚洲国产片色| 久久亚洲二区| 久久精品在这里| 国产精品视频免费在线观看| 亚洲激情国产| 亚洲人成在线观看网站高清| 久久久久国产一区二区三区四区 | 久久精品日产第一区二区| 在线亚洲欧美| 欧美激情综合五月色丁香| 免费久久99精品国产自| 国产欧美一区二区三区另类精品 | 一本大道久久精品懂色aⅴ | 午夜日韩av| 亚洲一区中文字幕在线观看| 欧美精品v国产精品v日韩精品 | 亚洲欧洲三级电影| 久久av二区| 久久婷婷人人澡人人喊人人爽| 欧美一区二区国产| 亚洲欧美日韩视频二区| 欧美体内she精视频在线观看| 亚洲欧美综合国产精品一区| 欧美国产日韩一区二区在线观看| 日韩一区二区精品视频| 免费在线观看日韩欧美| 毛片基地黄久久久久久天堂| 伊人久久大香线蕉综合热线| 亚洲激情黄色| 欧美在线综合| 蜜臀a∨国产成人精品| 极品日韩av| 久久夜色精品| 亚洲国产导航| 亚洲视频自拍偷拍| 国产精品日韩在线一区| 欧美一区二区三区婷婷月色| 久久久久久日产精品| 伊人久久久大香线蕉综合直播 | 国产精品一区2区| 亚洲毛片在线观看.| 亚洲桃花岛网站| 国产美女精品一区二区三区| 欧美一区91| 亚洲国产高清自拍| 亚洲一级片在线观看| 国产区欧美区日韩区| 久久综合成人精品亚洲另类欧美 | 欧美一区二区女人| 国产在线播精品第三| 久久综合久久久| 亚洲国产精品va| 午夜精品福利在线观看| 韩国视频理论视频久久| 欧美日韩国产一中文字不卡 | 欧美一区二区视频网站| 国内精品嫩模av私拍在线观看 | 欧美二区在线| 在线亚洲国产精品网站| 久久夜色精品国产欧美乱| 亚洲人久久久| 国产日韩欧美制服另类| 欧美黄在线观看| 欧美一区二区三区婷婷月色 | 久久激情视频久久| 亚洲第一免费播放区| 亚洲欧美日韩在线| 亚洲精品国产精品国产自| 国产欧美精品一区aⅴ影院| 欧美精品 日韩| 久久亚洲二区| 欧美一区激情| 亚洲一区二区毛片| 亚洲大胆女人| 久久亚洲一区二区| 亚洲欧美日本在线| 亚洲免费av电影| 韩国精品一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 亚洲黑丝在线| 久久精品国产第一区二区三区| 国产精品久在线观看| 久热精品在线视频| 久久精品免费| 欧美体内she精视频在线观看| 蜜臀av国产精品久久久久| 亚洲在线中文字幕|