• <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>

            C++編程失樂園

            致力于解決論壇的不足,探討C++的原理

            C++隨筆 之 STL[vector]的存儲技術(原創)

            首先我們先來看Example Code:
            #include <vector>
            #include <iostream>
            #include <memory>
            using namespace std;
            void main()
            {
            ?vector<int> v;
            //?cout<<v.allocator;
            ?v.push_back(0);
            ?v.push_back(1);
            ?v.push_back(2);
            ?v.push_back(3);
            ?v.push_back(4);
            ?v.push_back(5);
            ?cout<<v.max_size();
            }
            利用VC6.0的內存調試
            ?v.push_back(0);之后
            //_First迭代器00481B40
            //_Last迭代器00481B44
            //_End迭代器004B1B44
            ?v.push_back(1);之后
            //_First迭代器00481B00
            //_Last迭代器00481B08
            //_End迭代器004B1B08
            為什么在執行一次push_back之后,迭代器全部會變呢?
            下面我們看看P.J. Plauger的代碼
            ?void insert(iterator _P, size_type _M, const _Ty& _X)
            ??{if (_End - _Last < _M)
            ???{size_type _N = size() + (_M < size() ? size() : _M);
            ???iterator _S = allocator.allocate(_N, (void *)0);
            ???iterator _Q = _Ucopy(_First, _P, _S);
            ???_Ufill(_Q, _M, _X);
            ???_Ucopy(_P, _Last, _Q + _M);
            ???_Destroy(_First, _Last);
            ???allocator.deallocate(_First, _End - _First);
            ???_End = _S + _N;
            ???_Last = _S + size() + _M;
            ???_First = _S; }
            ??else if (_Last - _P < _M)
            ???{_Ucopy(_P, _Last, _P + _M);
            ???_Ufill(_Last, _M - (_Last - _P), _X);
            ???fill(_P, _Last, _X);
            ???_Last += _M; }
            ??else if (0 < _M)
            ???{_Ucopy(_Last - _M, _Last, _Last);
            ???copy_backward(_P, _Last - _M, _Last);
            ???fill(_P, _P + _M, _X);
            ???_Last += _M; }}

            其中M = 1;
            當_End - _Last < _M時,就要重新分配內存了,哦原來時這樣的.
            [個人認為,在方便調試的時候,可以把C:\MSDEV\VC98\Include\下面的vector文件中的protected改成public:]
            下面我給出在5次插入之后其內存分配
            push_back(2)
            //00481AC0
            //00481ACC
            //00481AD0
            push_back(3);
            //00481AC0
            //00481AD0
            //00481AD0
            push_back(4);
            //00481B20
            //00481B34
            //00481B40
            push_back(5);
            //00481B20
            //00481B38
            //00481B40
            注意沒有,_Last - _First之后的明顯是size() * 4
            [注:在VC6.0的STL版本是采用的PJSTL版本,是一種公認最垃圾的STL版本
            在C++ Builder中的STL版本是采用的RW版本,Rouge Wave公司
            在unix下面GCC采用的是SGI Silicon Graphics Computer System Inc公司STL版本,我認為在可讀性,可移植性方面最好的一個版本]

            posted on 2007-01-04 14:26 木木頭 閱讀(947) 評論(1)  編輯 收藏 引用 所屬分類: C++特性

            評論

            # re: C++隨筆 之 STL[vector]的存儲技術(原創) 2007-01-04 14:37 cppLock

            個人認為,這樣的話,如果數據很大,vector的效率不會很高  回復  更多評論   

            導航

            <2007年1月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28293031123
            45678910

            統計

            常用鏈接

            留言簿(3)

            隨筆分類(29)

            搜索

            最新隨筆

            最新評論

            亚洲国产成人久久综合碰碰动漫3d| 国产欧美久久久精品影院| 色综合久久天天综合| 99国产精品久久久久久久成人热| 国产精品久久免费| 久久久久久噜噜精品免费直播| 久久无码一区二区三区少妇 | 久久久久久久综合日本亚洲| 狠狠色伊人久久精品综合网| 日产精品久久久久久久| 久久99精品久久久久久动态图 | 亚洲国产精品久久久久久| 久久99精品国产麻豆婷婷| 97久久国产露脸精品国产| 久久久久久久综合日本亚洲 | 精品免费久久久久久久| 亚洲国产精品久久久久婷婷软件| 亚洲七七久久精品中文国产| 久久精品国产亚洲AV电影| 四虎国产精品免费久久久| 久久成人小视频| 青青草国产精品久久| 无码八A片人妻少妇久久| 国产L精品国产亚洲区久久| 久久精品国产亚洲AV影院| 久久亚洲国产欧洲精品一| 热久久国产欧美一区二区精品| 久久精品麻豆日日躁夜夜躁| 一级做a爰片久久毛片看看| WWW婷婷AV久久久影片| 国产精品久久新婚兰兰| 欧美精品一本久久男人的天堂| yy6080久久| 久久久久国产精品麻豆AR影院| 日产精品久久久一区二区| 久久男人中文字幕资源站| 好久久免费视频高清| 性色欲网站人妻丰满中文久久不卡| 久久久久久国产a免费观看不卡| 久久精品一区二区国产| 亚洲人成精品久久久久|