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

勤能補拙,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 閱讀(2624) 評論(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>
            亚洲人成高清| 免费观看在线综合色| 激情91久久| 欧美日韩在线一区二区| 午夜免费日韩视频| 亚洲毛片网站| 欧美国产日本韩| 久久久爽爽爽美女图片| 亚洲午夜成aⅴ人片| 亚洲高清视频在线| 国产综合精品| 国产精品国产三级国产aⅴ浪潮 | 国产精品夜色7777狼人 | 久久人人爽人人爽爽久久| 亚洲天堂av高清| 亚洲高清激情| 国产亚洲一区二区三区在线播放| 欧美日韩在线播放一区二区| 欧美国产精品劲爆| 免费人成网站在线观看欧美高清 | 美女脱光内衣内裤视频久久网站| 亚洲免费在线看| 亚洲国产女人aaa毛片在线| 亚洲一区一卡| 一区二区三区三区在线| 亚洲日本成人网| 影音先锋久久| 国产三级欧美三级| 国产精品视频xxx| 国产精品卡一卡二| 欧美日韩三级| 欧美激情欧美狂野欧美精品| 久久先锋影音| 麻豆精品国产91久久久久久| 久久精品久久综合| 欧美在线观看视频一区二区三区| 亚洲午夜精品久久久久久app| 亚洲片区在线| 日韩一级视频免费观看在线| 亚洲人成人一区二区在线观看| 亚洲国产精品久久91精品| 蜜桃av一区| 久久久99爱| 久久久久91| 久久青草久久| 久久久久国色av免费观看性色| 久久久久国产精品www| 久久久久久久久久久久久久一区| 久久狠狠亚洲综合| 久久综合九九| 欧美大片一区| 亚洲精品国产精品国自产观看| 亚洲精品一线二线三线无人区| 蜜桃久久精品一区二区| 美女精品国产| 亚洲精品国产精品国自产观看浪潮 | 亚洲午夜羞羞片| 亚洲欧美在线免费观看| 久久精品人人做人人爽| 久久久夜精品| 久久日韩精品| 欧美日韩1080p| 欧美精品福利视频| 国产精品v欧美精品v日韩| 国产三区二区一区久久| 国产亚洲欧美另类中文| 一区三区视频| 99国产精品私拍| 欧美在线视频全部完| 久久精品最新地址| 老色批av在线精品| 亚洲国产第一页| 亚洲一卡久久| 久久久久久久久久久久久女国产乱 | 免费91麻豆精品国产自产在线观看| 欧美成人精品高清在线播放| 日韩视频免费观看高清在线视频| 亚洲天堂av电影| 久久精品一二三区| 欧美日韩亚洲网| 国产又爽又黄的激情精品视频| 国产综合色在线| 夜夜爽av福利精品导航| 久久精品国产免费看久久精品| 欧美成人情趣视频| 亚洲午夜高清视频| 久久精品最新地址| 欧美性做爰猛烈叫床潮| 亚洲国产精品久久久久秋霞不卡| 亚洲欧美电影院| 欧美激情视频一区二区三区免费| 在线亚洲美日韩| 久久久噜噜噜久噜久久| 欧美视频在线免费| 亚洲黄色在线视频| 欧美在线视频在线播放完整版免费观看| 欧美α欧美αv大片| 中文一区二区| 欧美国产日韩在线| 国产一区二区观看| 亚洲视频自拍偷拍| 欧美激情在线免费观看| 久久国产精品一区二区| 国产精品视频99| 一区二区三区久久精品| 欧美国产日韩一区| 欧美一区三区二区在线观看| 嫩草影视亚洲| 黄色成人av在线| 欧美亚洲日本国产| 亚洲免费成人| 久久国产精彩视频| 欧美性一区二区| 亚洲天堂激情| 亚洲人线精品午夜| 欧美1区2区3区| 亚洲国产精品999| 欧美一区二区三区四区高清| 日韩亚洲欧美成人| 模特精品裸拍一区| 亚洲欧洲在线观看| 亚洲电影av在线| 久久久久久久久久久久久久一区| 欧美性大战xxxxx久久久| 夜夜嗨av色综合久久久综合网| 美女精品在线| 久久久久亚洲综合| 激情综合在线| 狂野欧美一区| 久久九九精品99国产精品| 国语自产在线不卡| 久久性天堂网| 久久一二三区| 亚洲激情校园春色| 亚洲第一黄色网| 免费观看成人www动漫视频| 亚洲国内自拍| 亚洲第一级黄色片| 久久久噜噜噜久久人人看| 亚洲国产高清自拍| 欧美激情一区二区三区在线视频 | 亚洲女人天堂av| 国产伦精品一区二区| 亚洲视频在线免费观看| 亚洲乱码视频| 欧美国产在线视频| 这里是久久伊人| 亚洲六月丁香色婷婷综合久久| 欧美日韩一区二区三| 亚洲综合社区| 欧美一区二区视频免费观看 | 亚洲一区在线播放| 亚洲欧美文学| 伊人婷婷欧美激情| 亚洲欧洲一区二区三区久久| 欧美日韩视频在线一区二区 | 亚洲欧洲综合| 国产精品hd| 亚洲摸下面视频| 久久xxxx精品视频| 1024精品一区二区三区| 亚洲高清不卡在线观看| 欧美日韩一卡二卡| 欧美在线观看你懂的| 欧美在线综合| 亚洲毛片一区| 亚洲综合色自拍一区| 在线观看欧美日韩国产| 亚洲黄网站在线观看| 国产精品美女久久久久久久| 久久伊人亚洲| 欧美日韩精品一区二区天天拍小说| 亚洲免费在线视频| 久久人人爽国产| 亚洲一级在线观看| 久久久久欧美| 亚洲视频网站在线观看| 午夜精品久久一牛影视| 亚洲激情视频网站| 欧美激情亚洲国产| 国产精品欧美久久| 欧美激情91| 国产精品igao视频网网址不卡日韩| 久久国产精品99久久久久久老狼 | 欧美高清在线一区| 亚洲一区国产视频| 老司机久久99久久精品播放免费| 亚洲午夜精品久久久久久浪潮| 欧美一区二区成人| 亚洲免费成人av电影| 欧美伊人久久久久久久久影院| 最新成人av在线| 午夜久久黄色| 亚洲视频在线观看| 免费看成人av| 久久影院午夜论| 国产精品久久综合| 亚洲三级毛片| 亚洲黄网站在线观看| 久久久精品一区二区三区|