• <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 木木頭 閱讀(948) 評論(1)  編輯 收藏 引用 所屬分類: C++特性

            評論

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

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

            導航

            <2006年12月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統計

            常用鏈接

            留言簿(3)

            隨筆分類(29)

            搜索

            最新隨筆

            最新評論

            久久综合综合久久97色| 香港aa三级久久三级| 精品国产乱码久久久久久浪潮| 久久夜色精品国产网站| 国产精品一久久香蕉产线看 | 久久久久国产亚洲AV麻豆| 国产福利电影一区二区三区,免费久久久久久久精 | 亚洲国产视频久久| 伊人久久大香线蕉av不卡| 欧美噜噜久久久XXX| 久久免费小视频| 亚洲欧美另类日本久久国产真实乱对白 | 丁香五月综合久久激情| 久久夜色撩人精品国产| 中文字幕久久精品无码| 青青草国产成人久久91网| 亚洲国产日韩综合久久精品| 久久精品天天中文字幕人妻| 久久人人超碰精品CAOPOREN| 人妻少妇久久中文字幕| 久久久久噜噜噜亚洲熟女综合| 久久精品国产99国产精品导航 | 理论片午午伦夜理片久久| 国内精品久久久久伊人av| 久久亚洲AV无码西西人体| 久久精品人人做人人爽97| 日本国产精品久久| 亚洲国产精品婷婷久久| 无码专区久久综合久中文字幕| 久久久久亚洲AV成人网人人软件| 99久久综合狠狠综合久久止| 久久午夜免费视频| 久久99热这里只有精品国产| 五月丁香综合激情六月久久| 色狠狠久久综合网| 久久久精品人妻无码专区不卡| 青青草原综合久久大伊人精品| 天堂久久天堂AV色综合| 精产国品久久一二三产区区别 | 日本久久久久亚洲中字幕| 久久久久久精品免费看SSS |