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

3d Game Walkman

3d圖形渲染,網(wǎng)絡(luò)引擎 — tonykee's Blog
隨筆 - 45, 文章 - 0, 評(píng)論 - 309, 引用 - 0
數(shù)據(jù)加載中……

今天找到一個(gè)不得不用deque的理由

過去總以為vector和deque差不多,效率方面deque和vector接近,那干脆用效率高的vector好了。
但我忽略了另一方,一個(gè)事務(wù)存在就有它的理由,今天找到程序里面隱藏的bug給了我不得不用deque的理由,
deque和vector的結(jié)構(gòu)很類似,但它是多段連續(xù)空間,如果vector空間不夠的時(shí)候,要重新分配空間,并把所有的數(shù)據(jù)復(fù)制到新的空間中去,
deque不會(huì)這么做,它會(huì)去另外開辟一塊連續(xù)空間去存放數(shù)據(jù),所以存儲(chǔ)效率方面deque高于vector,但deque又不同于鏈表,它可以說是順序存儲(chǔ)結(jié)構(gòu)和鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的一個(gè)折中方案把,今天我寫了段代碼,是這樣的結(jié)構(gòu)

vector<SerializedEntity> archiveEntities; //也許你要問問什么不用vector<SerializedEntity*>,我這里比較特別,因?yàn)橐x寫磁盤的數(shù)據(jù),序列化存儲(chǔ)                                            //回避了指針的數(shù)據(jù)讀寫方式,所以用的vector<SerializedEntity>
那么:Entity * ent = &archive[0];          //看似沒問題,其實(shí)里面暗藏殺機(jī)
這個(gè)archiveEntities 如果不改變是沒有問題,但如果序列集又動(dòng)態(tài)添加了數(shù)據(jù),恰好沒有預(yù)留空間,那么將導(dǎo)致整個(gè)集合重新分配連續(xù)空間了,所以那個(gè)引用也將“失效了”,這讓我很頭疼,這個(gè)時(shí)候讓我想起了deque,它真的很棒,不會(huì)去重整空間,需要的時(shí)候再開辟其他連續(xù)的空間,雖然讀的效率降低了,但
這點(diǎn)損失對(duì)于我的程序基本可以忽略不計(jì)的,IO數(shù)據(jù)本身就很少去遍歷訪問,卻能給程序很好的去“引用”,不用擔(dān)心引用失效的情況,這方面deque確實(shí)是個(gè)很好的選擇
找到一篇文章與大家分享一下,也是應(yīng)證我的觀點(diǎn)的:

operator[]

  operator[] 是指通過下標(biāo)取數(shù)據(jù)。顯然 list 的復(fù)雜度為O(N),非常慢。而 vector、deque 均為 O(1)。讓我們想象下 deque::operator[] 的實(shí)現(xiàn):

 

 _E deque::operator[](int i)
{
  return m_storage[i/BlockSize][i%BlockSize];
} 

 

  可以看出,deque 只比 vector 多了一次內(nèi)存訪問。

  空間性能分析

  push_back

  vector

  很不幸,如果 vector 采用 N*2 的內(nèi)存增長(zhǎng)模型(通常如此),那么在最差的情況下,空間復(fù)雜度就是 2*N ,最好的情況下為 N(所有的內(nèi)存都用上了)。平均來講,空間復(fù)雜度為 1.5*N .也就是說,通常差不多有一半的內(nèi)存是被浪費(fèi)的。

  list

  list 的空間浪費(fèi)與 vector 相比不遑多讓。它的空間復(fù)雜度為 (1 + sizeof(pointer)*2/sizeof(_E))*N.如果我們讓 list 存儲(chǔ)的元素為 pointer(即 _E = pointer),那么空間復(fù)雜度為 3*N,比 vector 還浪費(fèi)。

  deque

  deque 的最差情況下的空間復(fù)雜度為 N + sizeof(pointer)*2*N/(BlockSize*sizeof(_E))(這里假設(shè)vector也采用 2*N 增長(zhǎng)模型,平均復(fù)雜度則將式中2改為1.5即可)。如果我們保存的元素為 pointer(即 _E = pointer),并且BlockSize取512,那么空間復(fù)雜度為 N + N/256.也就是說最差情況下只浪費(fèi)了 N/256 的內(nèi)存。

  deque的其他特性

  元素地址不變

  由于 deque 并不進(jìn)行數(shù)據(jù)搬移,帶來一個(gè)有意思的特性,就是 deque 的元素地址在只有 push_back/push_front,沒有 insert/erase 時(shí),可保持元素地址不變。

  需要注意的是,vector 并不具備這樣的特性。如下的代碼是不合法的:

 

std::vector<int> vec;
...
int& elem = vec[i];
vec.push_back(100);
elem = 99; // error: can't access elem since vec was changed! 

 

  由于取得 elem 之后存在 push_back 操作,所獲得的元素地址(&elem)可能會(huì)由于內(nèi)存搬移而失效。但是如果我們將容器換為 std::deque,則這個(gè)代碼不會(huì)有任何問題。

 

 std::deque<int> dq;
...
int& elem = dq[i];
dq.push_back(100);
elem = 99; // ok! 

 

  另外需要注意的是,元素地址不變,并不代表 iterator 不變,如下的代碼 deque 并不支持:

 

std::deque<int> dq;
...
std::deque<int>::iterator it = dq.begin() + i;
dq.push_back(100);
*it = 99; // error: can't access iterator since deque was changed!

 

  結(jié)論

  通過 vector, list, deque 的時(shí)間、空間性能對(duì)比,我們可以看出,應(yīng)該提倡盡可能使用 deque 這個(gè)容器。特別是,如果要承受海量數(shù)據(jù),deque 是最合適的人選了。


posted on 2009-05-24 13:25 李侃 閱讀(8328) 評(píng)論(15)  編輯 收藏 引用 所屬分類: 雜談

評(píng)論

# re: 今天找到一個(gè)不得不用deque的理由[未登錄]  回復(fù)  更多評(píng)論   

只能說你對(duì)vector沒有認(rèn)識(shí)清楚而以,一般也都使用iterator
2009-05-24 13:36 | 關(guān)中刀客

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

我現(xiàn)在討論的不是迭代,任何集合都能迭代,光用一個(gè)iterator去遍歷,任何集合都沒有差別了。那一個(gè)vector就夠了還要list和deque做什么?

我現(xiàn)在討論的是它們的內(nèi)部結(jié)構(gòu)的差別,根據(jù)不同的場(chǎng)景而要用出這些集合的差別才是真道理,樓上看清楚,我現(xiàn)在就是想在外部指針去引用集合內(nèi)部的元素,就是不想每次訪問的時(shí)候都去迭代,集合如果只增不減的情況下,用deque是穩(wěn)定的,而vector是不穩(wěn)定的,vector存在空間重排,deque不存在空間重排,這是我要闡述的觀點(diǎn)
2009-05-24 14:01 | 李侃

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

用deque是穩(wěn)定的
2009-05-24 15:38 | 九久讀書人

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

我試了試,似乎erase中間的元素以后,各元素的地址依然穩(wěn)定,vc自帶的的deque 是這樣的,不知道其他版本的deque會(huì)不會(huì)也是這樣?

我已經(jīng)深深的愛上deque了 ^^
2009-05-24 15:52 | 李侃

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

std::deque<int> dq;
...
int& elem = dq[i];
dq.push_back(100);
elem = 99; // ok!

這樣的代碼對(duì)deque即使正確也還是不要用吧。
2009-05-24 16:55 | 阿淡

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

后面的部分是我摘錄網(wǎng)上的文章,覺得好像也沒什么不妥
當(dāng)然了如果元素被移除了,這樣去訪問那會(huì)是危險(xiǎn)的。
2009-05-24 17:32 | 李侃

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

個(gè)人意見是,不要直接引用容器內(nèi)的元素地址,特別是長(zhǎng)期引用
就算你知道自己在做什么,別人也不知道
2009-05-24 18:01 | LOGOS

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

依賴于一個(gè)容器是否分配內(nèi)存本身就是你的問題,不是該不該vector還是queue的問題。如果想避免分配內(nèi)存帶來的問題,請(qǐng)用vector<shared_ptr<OBJ>>。
2009-05-24 21:25 | 陳梓瀚(vczh)

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

我明白,如果是vector<Entity*>的方式,根本不用去討論該去用vector還是queue,重排就重排了,指針不會(huì)變
但如果是vector<Entity> 的形式情況就不同了

這樣的類別的集合確實(shí)就不該直接去引用集合中元素的地址,這不是一個(gè)好的習(xí)慣。

主要是:我的序列化存儲(chǔ)層只能支持 集合<entity>的形式
不支持 集合<Entity*>的形式,想引用從文件讀取的集合數(shù)據(jù)又不想做太多的拷貝,迫于無賴。

只好回頭再想想看有沒有更好的折中方案了。

2009-05-24 22:34 | 李侃

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

不想拷貝又不想自己釋放,用智能指針。
2009-05-25 10:28 | 陳梓瀚(vczh)

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

deque 不能 memcpy
2009-05-26 21:21 | lovelypig

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

STL只是一份標(biāo)準(zhǔn)還不是實(shí)現(xiàn),作為vector來講,它設(shè)計(jì)目標(biāo)應(yīng)該是作為一個(gè)大小伸縮的數(shù)組,比如&v[0]可以當(dāng)作一個(gè)數(shù)組的指針(如果!v.empty()的話),而deque則不行;deque為了能夠以常數(shù)時(shí)間在順序容器的頭部及尾部進(jìn)行push操作而設(shè)計(jì)的,但這個(gè)設(shè)計(jì)的代價(jià)通常很大,應(yīng)該并不是你所想像的二維數(shù)組的形式,比如SGI的deque設(shè)計(jì)就采用了一種類似于文件系統(tǒng)中二級(jí)表的方式,其直接結(jié)果就是迭代器操作的代價(jià)很高。現(xiàn)實(shí)程序中你會(huì)發(fā)現(xiàn)很少有人會(huì)用deque,這固然有書中介紹比較少的原因,但也與其操作代價(jià)較高是分不開的。
我的意見是,除非不得以,否則使用vector而不要用deque;
你的這種情況,我建議你可以自己寫一個(gè)容器,那怕是用memove,通常也會(huì)比std::vector快很多的
2009-08-09 19:58 | 李現(xiàn)民

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

deque用的不當(dāng),會(huì)造成內(nèi)存急劇消耗!
2009-09-25 20:39 |

# re: 今天找到一個(gè)不得不用deque的理由  回復(fù)  更多評(píng)論   

本來就是各有所長(zhǎng)的設(shè)計(jì),vector設(shè)計(jì)規(guī)范就是連續(xù),引用元素說得清清楚楚就是即時(shí)有效,不能緩存,你就要違背規(guī)范使用,還要說它不好,那是你愚蠢還是它不對(duì)呢?
各種容器就是為了滿足不同需求設(shè)計(jì)的,各有所長(zhǎng)各取所需,但不要說一個(gè)取代另一個(gè)的蠢話,如果你覺得要取代了,說明你還認(rèn)識(shí)不夠,也說明你起初選擇的時(shí)候是愚蠢的。
2012-05-10 13:07 | oldworm

# re: 今天找到一個(gè)不得不用deque的理由[未登錄]  回復(fù)  更多評(píng)論   

@李侃
STL用迭代器隱藏了線性容器間的區(qū)別,但這不代表因此各容器就沒區(qū)別吧?
每個(gè)容器都有自己的特點(diǎn),不同應(yīng)用場(chǎng)合性能是有差異的,所以才提供這么多線性表容器吧?
遍歷STL線性表還是用迭代器,C語(yǔ)法和C++語(yǔ)法混合起來用是不安全的。
2012-07-06 14:27 | Sine
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久www成人免费精品| 国产女优一区| 亚洲欧美日韩在线综合| 亚洲大片精品永久免费| 欧美一区二区三区免费大片| 亚洲伦理在线免费看| 韩国三级电影一区二区| 国产精品久久毛片a| 欧美精品久久一区二区| 久久这里有精品视频| 小黄鸭视频精品导航| 99国产精品久久久| 91久久线看在观草草青青| 美女日韩在线中文字幕| 久久国产加勒比精品无码| 亚洲一二三区在线| 亚洲精品国产精品国自产观看浪潮 | 国产网站欧美日韩免费精品在线观看 | 久久天天躁狠狠躁夜夜爽蜜月| 亚洲在线一区| 欧美1区3d| 免费在线观看日韩欧美| 久久久亚洲午夜电影| 久久精品二区亚洲w码| 亚洲男女自偷自拍图片另类| 一区二区三区久久网| 99精品国产高清一区二区| 亚洲欧洲另类国产综合| 亚洲国产福利在线| 91久久午夜| 亚洲欧洲在线一区| 日韩视频不卡| 99精品国产在热久久婷婷| 亚洲精品自在久久| 一区二区三区久久久| 在线一区二区三区四区| 一区二区av在线| 一区二区三区精品久久久| 一区二区三区精品视频在线观看 | 久久精品国产91精品亚洲| 国产精品麻豆成人av电影艾秋| 亚洲精品久久久久久久久| 一区二区三区在线免费观看| 有码中文亚洲精品| 亚洲高清123| 亚洲精品日韩激情在线电影| 91久久精品久久国产性色也91| 亚洲三级视频| 中文av字幕一区| 午夜精品视频在线| 久久国产日本精品| 亚洲欧美精品伊人久久| 国产精品h在线观看| 亚洲天堂成人在线观看| 久久亚洲私人国产精品va| 欧美日韩高清一区| 亚洲国产综合91精品麻豆| 国产日韩欧美一区二区三区在线观看| 99这里有精品| 一本在线高清不卡dvd| 欧美成人午夜剧场免费观看| 亚洲国产综合91精品麻豆| 99国内精品久久| 亚洲国产精品99久久久久久久久| 亚洲国产精品成人综合色在线婷婷| 亚洲人成网站在线观看播放| 亚洲特色特黄| 久久视频一区| 欧美日韩亚洲一区三区| 国产精品人人做人人爽| 影音先锋日韩资源| 一区二区三区产品免费精品久久75 | 欧美电影在线播放| 欧美日韩一区二区三区视频| 国产精品自拍视频| 国内精品99| 宅男精品视频| 久久视频这里只有精品| 亚洲福利在线观看| 亚洲一区精品视频| 狂野欧美一区| 欧美先锋影音| 亚洲国产一区二区精品专区| 亚洲一区二区视频在线| 久久久噜噜噜久久人人看| 亚洲精华国产欧美| 午夜在线不卡| 欧美激情精品久久久久久久变态| 国产日韩精品综合网站| 亚洲精品女av网站| 久久精品视频免费播放| 亚洲精品乱码| 美女网站在线免费欧美精品| 欧美日韩一区二区在线| 亚洲电影av| 久久久久九九九九| 夜夜精品视频一区二区| 欧美自拍偷拍午夜视频| 国产精品久久久久久妇女6080| 影音先锋另类| 欧美在线国产| 在线视频一区观看| 免费在线亚洲| 国产一区二区三区久久精品| 亚洲一区二区免费视频| 欧美国产精品v| 久久精品国产91精品亚洲| 国产精品欧美一区二区三区奶水| 一区二区日韩伦理片| 日韩视频专区| 麻豆成人91精品二区三区| 亚洲欧美欧美一区二区三区| 欧美国产精品人人做人人爱| 在线观看亚洲精品| 久久福利资源站| 亚洲欧美日韩在线一区| 国产精品免费网站在线观看| 亚洲午夜久久久久久久久电影网| 欧美激情女人20p| 久久青草欧美一区二区三区| 狠狠综合久久av一区二区老牛| 久久国产99| 欧美一区网站| 好吊日精品视频| 久久综合久色欧美综合狠狠| 香蕉久久夜色| 国产一区视频网站| 久久青草久久| 久久久久久久999精品视频| 激情久久久久久久| 母乳一区在线观看| 久久综合精品国产一区二区三区| 在线观看欧美视频| 欧美国产综合视频| 老司机一区二区三区| 亚洲精品国产系列| 亚洲精品在线免费| 国产精品国产三级国产专区53| 亚洲直播在线一区| 欧美一级理论性理论a| 国产一在线精品一区在线观看| 久久久久久久久蜜桃| 久久久国产一区二区三区| 在线观看日韩精品| 亚洲激情第一页| 欧美视频中文字幕| 久久福利视频导航| 久久色在线播放| av成人免费| 亚洲影视中文字幕| 尤物网精品视频| 亚洲第一主播视频| 欧美视频在线观看 亚洲欧| 欧美在线看片| 久热爱精品视频线路一| 一区二区三区精品国产| 欧美激情一区在线观看| 欧美搞黄网站| 亚洲欧美国产一区二区三区| 亚洲自拍偷拍麻豆| 在线免费一区三区| 亚洲精品综合久久中文字幕| 国产麻豆91精品| 榴莲视频成人在线观看| 欧美日韩高清不卡| 久久国产99| 欧美精品一区二区蜜臀亚洲| 香蕉久久夜色精品国产使用方法| 久久精品一区蜜桃臀影院| 日韩视频免费在线观看| 亚洲一区二区三区777| 亚洲国产精品成人| 中文日韩在线视频| 亚洲国产乱码最新视频| 99精品国产高清一区二区| 国内精品久久久久久| 亚洲国产精品悠悠久久琪琪| 欧美午夜精品久久久久久人妖 | 亚洲国产日韩在线| 国产精品一区二区三区免费观看| 免费日韩av片| 国产伦精品一区二区三区高清版| 欧美激情乱人伦| 国产日韩在线看片| 亚洲毛片一区二区| 1024亚洲| 午夜精品久久久久久久| 亚洲最新中文字幕| 久久精品最新地址| 性欧美videos另类喷潮| 欧美精品久久久久久久久久| 久久婷婷综合激情| 欧美午夜视频在线| 欧美77777| 国产伪娘ts一区| 亚洲性线免费观看视频成熟| 亚洲精品在线免费观看视频| 久久久精品999| 欧美在线国产| 国产精品国产精品|