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

勤能補拙,Expter

成都游戲Coder,記錄游戲開發過程的筆記和心得!

一個關于容器選取的刪除問題。


問題描述:
1個容器有大量元素,需要進行erase大部分數據的時候,需要遍歷這些元素,然后釋放item的空間,還要erase刪除其item。

一個庫,為了測試其性能的時候,需要保存所有外部使用者的數據,這里選取了map,vector和list.

為了簡化問題,我寫了下面測試代碼來測試各個操作:
數據節點:

struct node
{
    node(
int i){data = i;}
    
int data;
}

 1int _tmain(int argc, _TCHAR* argv[])
 2{
 3    typedef std::map<long,node*> Mptable;
 4    typedef std::vector<node*>   Vec;
 5    typedef std::list<node*>     List;
 6    
 7    Mptable        mapnode;
 8    Vec            vecnode;
 9    List        listnode;
10
11    for(int i = 1 ; i <= 100000 ; i++ )
12    {     
13        mapnode [ i ] = new node(i);
14        vecnode.push_back( new node(i) );
15        listnode.push_back( new node(i));
16    }

17
18    long time = timeGetTime( );
19    
20    for( Mptable::iterator itr = mapnode.begin() ; itr != mapnode.end() ;  )
21    {
22         delete itr->second;
23         mapnode.erase( itr++ );
24    }

25
26    std::cout <<"map : spend " << timeGetTime() - time << " msec " << std::endl;
27
28
29    time = timeGetTime( );
30    
31    for( Vec::iterator itr = vecnode.begin() ; itr != vecnode.end() ;  )
32    {
33         delete *itr;
34         itr = vecnode.erase( itr );
35    }

36
37    std::cout <<"vector : spend " << timeGetTime() - time << " msec " << std::endl;
38
39
40    time = timeGetTime( );
41    
42    for( List::iterator itr = listnode.begin() ; itr != listnode.end() ;  )
43    {
44         delete *itr;
45         itr = listnode.erase( itr );
46    }

47
48    std::cout <<"list : spend " << timeGetTime() - time << " msec" << std::endl;
49
50
51    return 0;
52}
Release下運行結果:
map : spend 31 msec
vector : spend 3734 msec
list : spend 35 msec


發現map的速度最快,vector最慢,list相當。

其實vector就是一個Array,只是Array是靜態大小,vector可以擴展,然后查看vector的erase的源碼:
iterator erase(const_iterator _Where)
        
{    // erase element at where
        _Move(_VIPTR(_Where) + 1this->_Mylast,
            _VIPTR(_Where));
        _Destroy(
this->_Mylast - 1this->_Mylast);
        
--this->_Mylast;
        
return (_Make_iter(_Where));
        }
有一個move操作,原來把當前iterator+1的往前移了,這樣的話會遍歷iterator后面所有的元素。


關于map的erase原理可以查看map的實現源碼:
由于map的erase后有一個維護過程,其實map是一個RB-Tree,刪除算法相對比較麻煩,刪除某個item會查找下一個item替換刪除的節點,同時還要考慮紅和黑的節點處理。同時還要保證map的erase后,平衡且有序。
所以map的erase主要做:
1.刪除item.
2.讓樹平衡,且有序。

list其實是一個雙向鏈表:
關于刪除其實是0(1)的操作,我們查看list的erase的操作:
    iterator erase(const_iterator _Where)
        
{    // erase element at _Where
 #if _ITERATOR_DEBUG_LEVEL == 2
        
if (_Where._Getcont() != this || _Where._Ptr == this->_Myhead)
            _DEBUG_ERROR(
"list erase iterator outside range");
        _Nodeptr _Pnode 
= (_Where++)._Mynode();
        _Orphan_ptr(
*this, _Pnode);

 
#else /* _ITERATOR_DEBUG_LEVEL == 2 */
        _Nodeptr _Pnode 
= (_Where++)._Mynode();
 
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */

        
if (_Pnode != this->_Myhead)
            
{    // not list head, safe to erase
            this->_Nextnode(this->_Prevnode(_Pnode)) =
                
this->_Nextnode(_Pnode);
            
this->_Prevnode(this->_Nextnode(_Pnode)) =
                
this->_Prevnode(_Pnode);

            _Dest_val(
this->_Alnod, _Pnode);
            
this->_Alnod.deallocate(_Pnode, 1);

            
--this->_Mysize;
            }

        
return (_Make_iter(_Where));
        }
主要代碼刪除就是下面刪除部分:
對prev和next節點進行處理即可。

關于list的移除竟然比map還要慢.

PS:測試為單線程。

當為100W數據的時候:
map : spend 300 msec
list :   spend 385 msec

咋list比map容器還要慢?
還是上面的代碼不能說明問題。

posted on 2011-01-14 14:58 expter 閱讀(2614) 評論(2)  編輯 收藏 引用 所屬分類: 其他學習筆記 、工作筆記 、算法與數據結構

評論

# re: 一個關于容器選取的刪除問題。 2011-01-17 18:42 小笨象

如果vector從最后一個開始刪除呢?
有沒有試過?  回復  更多評論   

# re: 一個關于容器選取的刪除問題。 2011-01-18 00:09 expter

@小笨象
你說那個確實可以提高效率。

只是不解禁用優化后,list比map快,不禁用map缺比list快。。
  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区免费在线看| 黑人一区二区| 一区二区三区四区蜜桃| 一本不卡影院| 国产精品成人在线观看| 欧美一区午夜视频在线观看| 性做久久久久久| 国语精品一区| 亚洲国内高清视频| 欧美久久一级| 久久高清一区| 免费的成人av| 亚洲一区二区三区免费在线观看| 亚洲一区视频| 亚洲国产老妈| 这里只有精品视频| 一区免费观看视频| 亚洲毛片播放| 韩国成人福利片在线播放| 欧美成人精品一区| 欧美调教vk| 久久免费视频一区| 欧美日韩一卡| 久久婷婷久久一区二区三区| 欧美激情按摩| 久久偷看各类wc女厕嘘嘘偷窃| 欧美国产日韩在线观看| 欧美一级理论片| 欧美国产极速在线| 久久这里只精品最新地址| 欧美日韩免费观看中文| 久热精品在线视频| 国产精品久久久久久久久免费| 欧美jizz19性欧美| 国产精品视频一区二区三区 | 亚洲影院在线| 久久精品国产综合| 亚洲欧美资源在线| 欧美另类在线观看| 免费中文日韩| 国产综合在线视频| 亚洲一区二区久久| 日韩一级欧洲| 免费成人高清在线视频| 久久麻豆一区二区| 国产欧美日韩三级| 亚洲天堂av电影| 亚洲手机成人高清视频| 欧美精品在线一区二区| 另类图片国产| 极品尤物av久久免费看| 亚洲欧美日韩国产综合在线| 亚洲一区二区成人在线观看| 欧美乱在线观看| 亚洲国产高清aⅴ视频| 一区在线电影| 久久噜噜噜精品国产亚洲综合| 欧美一区二区三区在线观看视频| 国产精品swag| 亚洲一区二区在线| 午夜精品一区二区三区在线播放| 欧美视频在线观看一区二区| av不卡免费看| 亚洲欧美区自拍先锋| 欧美日韩中文在线| 一本色道久久综合亚洲精品不| 夜夜嗨av一区二区三区四区| 欧美精品久久久久a| 亚洲精品久久久一区二区三区| av成人手机在线| 欧美人在线观看| av不卡在线看| 欧美一级二级三级蜜桃| 国产亚洲欧美一级| 久久婷婷国产麻豆91天堂| 欧美激情一区二区在线| 亚洲免费观看高清完整版在线观看| 欧美激情一区二区三区成人| 一本色道综合亚洲| 欧美在现视频| 伊人狠狠色丁香综合尤物| 欧美jizz19性欧美| 99一区二区| 久久久久久电影| 亚洲欧洲一二三| 国产精品久久福利| 久久爱www.| 亚洲三级网站| 久久久久久九九九九| 亚洲国产精品一区在线观看不卡| 欧美1区免费| 亚洲一区免费网站| 欧美电影在线免费观看网站| 一区二区三区视频观看| 国内成+人亚洲| 欧美高清hd18日本| 亚洲欧美视频在线| 欧美大尺度在线| 亚洲免费综合| 亚洲国产精品999| 国产精品夜夜夜| 嫩草影视亚洲| 香蕉成人啪国产精品视频综合网| 亚洲第一中文字幕| 国产精品扒开腿做爽爽爽视频 | 欧美精品在线观看91| 国产精品99久久久久久久vr| 久久婷婷国产综合国色天香| 亚洲一区免费网站| 1769国内精品视频在线播放| 欧美三日本三级三级在线播放| 久久国产色av| 99re6热在线精品视频播放速度| 久久久久网址| 午夜视频在线观看一区二区| 亚洲日韩中文字幕在线播放| 国产一区在线免费观看| 国产精品videossex久久发布| 免费亚洲一区二区| 欧美一区二视频| 夜夜爽夜夜爽精品视频| 亚洲激情偷拍| 亚洲第一免费播放区| 久久久久久久久岛国免费| 亚洲色无码播放| 亚洲最新在线| 日韩亚洲国产欧美| 91久久国产综合久久| 亚洲第一区在线| 韩日精品中文字幕| 国产婷婷一区二区| 国产精品一区二区久久久| 欧美日韩在线观看一区二区| 男女精品网站| 欧美成人一品| 欧美激情中文字幕一区二区| 免费成人网www| 欧美成人午夜激情视频| 欧美aaa级| 欧美精品一区二区视频| 欧美成年人视频| 欧美精品久久久久久久免费观看| 欧美成人精品h版在线观看| 欧美成人午夜激情| 欧美激情欧美激情在线五月| 欧美韩国在线| 欧美久久在线| 国产精品国产精品| 国产九九精品视频| 国产主播一区二区三区| 好吊一区二区三区| 亚洲国产另类久久精品| 亚洲三级色网| 亚洲在线观看免费| 午夜免费电影一区在线观看| 久久国产婷婷国产香蕉| 毛片一区二区三区| 欧美激情视频一区二区三区在线播放 | 亚洲国产精品99久久久久久久久| 亚洲国产欧美一区二区三区久久 | 国产精品亚洲一区| 国产一区二区精品| 亚洲国产一二三| 亚洲图片欧洲图片av| 香蕉久久a毛片| 麻豆av一区二区三区| 亚洲欧洲精品一区二区精品久久久| 夜夜爽www精品| 欧美一区国产在线| 欧美成人在线影院| 国产精品日韩| 亚洲福利久久| 欧美一区二区精品| 亚洲成人自拍视频| 亚洲综合99| 欧美va亚洲va香蕉在线| 国产精品理论片在线观看| 1024精品一区二区三区| 国产精品一区毛片| 欧美精品18+| 国产主播一区二区| 9人人澡人人爽人人精品| 欧美一级在线视频| 亚洲福利视频专区| 午夜伦欧美伦电影理论片| 欧美电影免费观看高清| 国产一区在线播放| 亚洲一区三区电影在线观看| 欧美福利小视频| 亚洲欧洲av一区二区| 欧美美女日韩| **网站欧美大片在线观看| 香港成人在线视频| 亚洲三级免费电影| 久久免费视频网| 国产视频在线观看一区二区三区 | 亚洲影院在线观看| 亚洲国产精品久久人人爱蜜臀| 欧美一区二区视频观看视频| 欧美性理论片在线观看片免费|