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

            評論

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

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

            導航

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

            統計

            常用鏈接

            留言簿(3)

            隨筆分類(29)

            搜索

            最新隨筆

            最新評論

            久久www免费人成看国产片| 久久亚洲欧美日本精品| 久久乐国产综合亚洲精品| 久久精品中文字幕一区| 99久久精品国内| 日日狠狠久久偷偷色综合0| 久久一日本道色综合久久| 青青草国产精品久久| 亚洲精品无码久久久久AV麻豆| 精品久久亚洲中文无码| 欧美综合天天夜夜久久| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久久国产乱子伦精品作者 | 久久这里都是精品| 国产精品岛国久久久久| 精品国产日韩久久亚洲| 99久久99久久精品国产片果冻| 欧美久久一级内射wwwwww.| 精品国际久久久久999波多野| 亚洲欧美国产精品专区久久| 久久精品成人免费网站| 久久国产乱子伦免费精品| 亚洲国产视频久久| 久久久久国产亚洲AV麻豆| 国产精品毛片久久久久久久| 青草国产精品久久久久久| 天天爽天天爽天天片a久久网| 91精品国产色综久久 | 亚洲精品无码久久久| 久久亚洲国产欧洲精品一| 无码超乳爆乳中文字幕久久| 久久午夜免费视频| 亚洲国产一成久久精品国产成人综合 | 精品国产青草久久久久福利| 久久99精品久久久久婷婷| 国内精品久久久久久久久电影网| 亚州日韩精品专区久久久| 国内精品久久久久久久涩爱 | 精品久久久久中文字| 成人a毛片久久免费播放| 岛国搬运www久久|