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

colorful

zc qq:1337220912

 

STL的remove函數(shù)和list的remove成員函數(shù)

http://www.cnblogs.com/kinuxroot/archive/2013/01/25/stl_remove_problem.html

今天看書剛剛看的,就記錄下來吧。這可能是老生常談了,權(quán)且作為一個(gè)警醒的例子吧。

大家都知道STL有兩個(gè)非常重要的組成部分,容器和算法。

算法就是一個(gè)個(gè)的函數(shù),通過迭代器和容器關(guān)聯(lián)在一起,完成一些工作。

算法和容器的分離為程序設(shè)計(jì)提供了很大的靈活性,但是也帶來了一些負(fù)面效果,下面我講的這個(gè)問題就是一個(gè)例子。

STL的算法里有一個(gè)remove函數(shù),而list自身也有一個(gè)remove函數(shù),功能都是一樣的,移除某一個(gè)元素,那我們應(yīng)該使用哪一個(gè)呢?

看一下下面這段程序

復(fù)制代碼
 1     list<int> numbers;  2   3     for ( int number = 0; number <= 6; number ++ ) {  4         numbers.push_front(number);  5         numbers.push_back(number);  6     }  7   8     copy(numbers.begin(), numbers.end(),  9             ostream_iterator<int>(cout, " ")); 10     cout << endl; 11  12     // remove algorithm will remove element but not erase the element from container 13     // it will return the logical desination of container 14     list<int>::iterator endOfNumbers = remove(numbers.begin(), numbers.end(), 3); 15  16     copy(numbers.begin(), numbers.end(), 17             ostream_iterator<int>(cout, " ")); 18     cout << endl;
復(fù)制代碼

輸出是什么呢?

第一行肯定是6 5 4 3 2 1 0 0 1 2 3 4 5 6,那么第二行會(huì)輸出什么?

如果是沒有仔細(xì)看過STL的人肯定會(huì)認(rèn)為remove(number.begin(), numbers.end(), 3)會(huì)移除所有值為3的元素。所以輸出是:6 5 4 2 1 0 0 1 2 4 5 6。

但是,我們看一下它真正的輸出:

6 5 4 2 1 0 0 1 2 4 5 6 5 6

你可能會(huì)非常驚訝,為什么最后會(huì)多出5和6兩個(gè)數(shù)呢?

我們來講一下remove算法的原理。

remove算法工作時(shí)并不是直接把元素刪除,而是用后面的元素替代前面的元素,也即是說如果我對1234這個(gè)序列remove 2,返回的序列是 1344(3被復(fù)制到2的位置,4被復(fù)制到3的位置)。

這樣上面的例子就好解釋了,那兩個(gè)3的元素并沒有被移除,而是用后面的元素覆蓋了前面的元素。多出的那兩個(gè)數(shù)沒有被移除掉而已。

那么我們應(yīng)該如何真正完成移除呢?remove函數(shù)會(huì)返回一個(gè)迭代器,那個(gè)迭代器是這個(gè)序列的邏輯終點(diǎn),也即是我代碼里的endOfNumbers,它指向倒數(shù)第二個(gè)5上。

于是我們要利用list的erase函數(shù)完成元素移除

numbers.erase(endOfNumbers, numbers.end());

這樣我們就完成了我們的工作,稍稍有點(diǎn)曲折……

其實(shí)我們可以把這兩步放在一起,比如如果我想接著移除所有值為2的元素

numbers.erase(remove(numbers.begin(), numbers.end(), 2), numbers.end());

這樣我們就可以一步到位了。

但是這樣好么?

不好。

大家會(huì)發(fā)現(xiàn),remove函數(shù)的原理是復(fù)制而不是指針的移動(dòng)(因?yàn)楹瘮?shù)操縱的是迭代器,而C++的迭代器沒有定義刪除操作),這樣會(huì)帶來一個(gè)問題:我們使用list是因?yàn)樗男薷牡男史浅8撸淖円幌轮羔樉涂梢粤恕6@里我們復(fù)制了元素,如果在vector中,可能還是高效的,因?yàn)関ector無論如何都要復(fù)制,而對于list就不是如此了,會(huì)極度降低我們的效率。

那我們怎么辦呢?

答案是使用list自己的remove函數(shù)

numbers.remove(1);

我們可以這樣刪除所有值為1的元素。

也即是說,如果要?jiǎng)h除list中的元素,我們應(yīng)該使用list的remove成員函數(shù),而不是remove算法

小結(jié)

我們都知道,STL是一個(gè)效率、復(fù)用性、靈活性折衷的產(chǎn)物,其中效率至關(guān)重要,所以STL已經(jīng)禁止了一些效率低的操作(比如list的隨機(jī)訪問),而鼓勵(lì)你去使用其它的容器。

但是,在算法中,為了靈活性,STL還是會(huì)犧牲一些東西,比如我們這個(gè)例子。

個(gè)人覺得,STL作為C++標(biāo)準(zhǔn)庫的一個(gè)組成部分,特點(diǎn)和C++本身一模一樣,強(qiáng)大而復(fù)雜,有些地方難以理解,很多細(xì)節(jié)需要學(xué)習(xí)注意,我們要學(xué)會(huì)避免陷入某些陷阱之中,比如這個(gè)例子就是一個(gè)效率陷阱。

其它更多的陷阱是錯(cuò)誤處理方面的,STL本身并沒有規(guī)定過多的錯(cuò)誤處理,大部分的錯(cuò)誤處理都交給了我們,理由很簡單:性能至上,如果一個(gè)東西自身沒有錯(cuò)誤檢查,我們可以包裝一個(gè)帶錯(cuò)誤檢查的類;但是如果這個(gè)東西自身就帶了錯(cuò)誤檢查,那么我們就沒有任何方法提升它的效率了。這也是很多C和C++庫的設(shè)計(jì)原則。

所以,很多時(shí)候,需要我們深入細(xì)節(jié),然后再?zèng)Q定到底怎么做。因?yàn)镃++就是如此:有很多路可以走,需要我們自己選擇最好的一條路。

分類: C++

posted on 2015-10-14 15:50 多彩人生 閱讀(918) 評論(1)  編輯 收藏 引用 所屬分類: boost

評論

# re: STL的remove函數(shù)和list的remove成員函數(shù)[未登錄] 2015-10-14 17:27 chipset

remove函數(shù)并不是真正刪除,而是取代,然后調(diào)析構(gòu),built-in類型沒有析構(gòu)函數(shù)結(jié)果就發(fā)現(xiàn)只是向前移動(dòng)了一下,僅覆蓋而已。
復(fù)制元素并非就一定不高效,對于built-in類型,復(fù)制比修改指針高效,畢竟程序設(shè)計(jì)里小對象比大對象常見的多。再說了,大對象哪里有動(dòng)不動(dòng)就拷貝的,那是設(shè)計(jì)失誤。
vector的刪除和插入都建議在尾進(jìn)行,否則效率低下,因此就沒有.pop_front這種貨。  回復(fù)  更多評論   

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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在线|亚洲一区二区| 亚洲精品免费在线观看| 中日韩男男gay无套| 久久久综合视频| 日韩视频中文| 亚洲欧美综合另类中字| 欧美护士18xxxxhd| 久久国产精品99国产| 免费在线成人| 亚洲视频自拍偷拍| 蜜桃久久精品乱码一区二区| 亚洲久久成人| 欧美一二区视频| 99国产精品99久久久久久粉嫩| 老牛影视一区二区三区| 国产亚洲欧美日韩日本| 亚洲欧美精品在线观看| 亚洲最新在线视频| 欧美三级在线视频| 欧美日韩国产综合久久| 精品成人久久| 亚洲欧洲在线播放| 欧美国产日韩一二三区| 欧美日韩成人综合| 一本综合精品| 性欧美大战久久久久久久久| 欧美电影在线观看完整版| 久久久久久高潮国产精品视| 国产一区清纯| 亚洲一区在线观看免费观看电影高清| 欧美在线短视频| 亚洲国产精品黑人久久久| 亚洲精品乱码久久久久久日本蜜臀| 亚洲激情在线| 久久丁香综合五月国产三级网站| 在线看视频不卡| 亚洲免费一级电影| 国产精品一区二区三区久久久| 久久久国产精品亚洲一区| 国产精品毛片在线| 欧美与欧洲交xxxx免费观看| 欧美va亚洲va国产综合| 狠狠色综合网站久久久久久久| 亚洲一二区在线| 亚洲人成毛片在线播放| 亚洲卡通欧美制服中文| 欧美日韩三区四区| 亚洲日本在线视频观看| 欧美精品一区二区三区蜜臀| 欧美丰满少妇xxxbbb| 欧美日韩色婷婷| 在线视频你懂得一区二区三区| 一区二区日韩免费看| 国产精品日日摸夜夜摸av| 午夜精品福利电影| 国产精品永久在线| 欧美成人dvd在线视频| 男男成人高潮片免费网站| 在线精品高清中文字幕| 六月天综合网| 在线午夜精品| 欧美一区亚洲一区| 日韩亚洲欧美成人| 国产精品有限公司| 欧美精品日日鲁夜夜添| 欧美一区二区三区在线观看视频| 加勒比av一区二区| 欧美性猛交xxxx乱大交退制版| 久久久久五月天| 午夜久久久久| 一区二区高清在线观看| 久久最新视频| 亚洲一区二区三区乱码aⅴ| 欧美激情第二页| 久久视频在线视频| 欧美三级午夜理伦三级中文幕| 久久久久久久一区二区| 欧美日韩成人在线播放| 久久爱www.| 久久精品一区二区三区不卡| 欧美一区二区三区四区高清 | 好看的亚洲午夜视频在线| 亚洲欧洲在线免费| 国产视频精品va久久久久久| 美女精品视频一区| 亚洲一区二区av电影| 久久综合久色欧美综合狠狠| 亚洲免费伊人电影在线观看av| 欧美在线观看视频一区二区| 欧美欧美天天天天操| 极品中文字幕一区| 国产婷婷色综合av蜜臀av| 日韩亚洲精品在线| 嫩草影视亚洲| 久久精品首页| 在线一区二区三区四区五区| 欧美综合77777色婷婷| 在线视频日韩精品| 欧美jizzhd精品欧美巨大免费| 国产女精品视频网站免费| 国产精品久久激情| 国内精品久久久久影院薰衣草| 国产精品香蕉在线观看| 午夜激情综合网| 久久久亚洲国产天美传媒修理工| 欧美好骚综合网| 一区二区三区精品在线| 午夜精品久久久久久久99水蜜桃 | 久久人人97超碰国产公开结果 | 亚洲免费在线观看| 久久香蕉国产线看观看网| 欧美激情影音先锋| 亚洲视频欧美视频| 久久成人免费电影| 99精品福利视频| 亚洲国产成人精品久久久国产成人一区| 亚洲视屏在线播放| 欧美高清在线一区二区| 欧美成人精品在线观看| 国产亚洲aⅴaaaaaa毛片| 国产精品欧美精品| 国内精品久久久久久久97牛牛| 欧美亚洲成人免费| 国产伦精品一区二区三| 欧美在线免费| 欧美激情一区二区三区蜜桃视频 | 久久精品99国产精品日本| 国产精品午夜电影| 久久一区二区三区国产精品| 久久久免费av| 久久久久久精| 欧美成人精品福利| 日韩图片一区| 亚洲天堂成人在线观看| 亚洲男人的天堂在线观看| 久久久99久久精品女同性| 国产一区二区高清不卡| 亚洲国产精品高清久久久| 国产精品久久久久9999高清 | 欧美大片在线观看一区| 欧美日韩专区在线| 欧美国产在线观看| 午夜激情综合网| 欧美经典一区二区| 亚洲精品日韩在线| 久久久久久久久久久久久久一区| 欧美成人自拍| 久久国产精品亚洲77777| 亚洲国产精品成人va在线观看| 亚洲高清视频的网址| 午夜伦欧美伦电影理论片| 欧美国产三区| 国产精品自拍网站| 亚洲与欧洲av电影| 国产日韩欧美精品综合| 欧美天堂亚洲电影院在线播放 | 亚洲丰满在线| 欧美精品三级在线观看| 久久九九免费| 欧美激情一区二区三区四区| 亚洲男人的天堂在线观看| 欧美区二区三区| 影视先锋久久| 午夜精品久久久久| 欧美在现视频| 狠狠干综合网| 久久国产精品99国产| 国产精品第十页| 一本色道久久综合亚洲精品高清| 欧美风情在线观看| 蜜臀久久99精品久久久久久9| 国产欧美一区二区精品忘忧草 | 久久成人18免费网站| 国产精品99久久久久久有的能看| 亚洲高清免费| 亚洲欧美日本国产专区一区| 国产精品每日更新在线播放网址| 亚洲黄色小视频| 美女视频黄免费的久久| 亚洲精品国产精品久久清纯直播| 欧美一区二区三区免费看| 欧美在线日韩| 在线观看国产成人av片| 欧美1级日本1级| 99在线精品观看| 一区二区三区国产| 久久久亚洲高清| 欧美日韩国产另类不卡| 久久久久久久久久久成人| 亚洲图片欧美一区| 国产精品久久久久久福利一牛影视| 欧美综合国产| 中文有码久久| 在线观看成人av| 先锋影音网一区二区| 男女av一区三区二区色多|