• <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的效率不會很高  回復  更多評論   

            導航

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

            統計

            常用鏈接

            留言簿(3)

            隨筆分類(29)

            搜索

            最新隨筆

            最新評論

            亚洲综合精品香蕉久久网| 久久综合久久鬼色| 国产精品一区二区久久精品涩爱 | yy6080久久| 亚洲AV日韩AV天堂久久| 国产人久久人人人人爽| 国产亚洲欧美成人久久片 | 久久亚洲sm情趣捆绑调教| 久久综合国产乱子伦精品免费| 99久久精品免费观看国产| 久久久久久久91精品免费观看| 久久精品国产亚洲77777| 久久精品国产91久久综合麻豆自制| 久久久久亚洲AV成人网| 日产精品久久久久久久| 久久精品二区| 久久婷婷综合中文字幕| 蜜桃麻豆WWW久久囤产精品| 久久青草国产手机看片福利盒子| 国产成人精品三上悠亚久久| 99久久无码一区人妻| 成人综合伊人五月婷久久| 国内精品伊人久久久久妇| 品成人欧美大片久久国产欧美...| 99久久国产亚洲综合精品| 精品无码久久久久久国产| 99久久国产综合精品麻豆| 亚洲综合日韩久久成人AV| 7777精品伊人久久久大香线蕉| 91精品国产91久久| 久久免费精品一区二区| 久久精品亚洲精品国产色婷| 伊人久久大香线蕉无码麻豆| 久久久久亚洲AV成人网| 大美女久久久久久j久久| 久久亚洲欧美日本精品| 丰满少妇人妻久久久久久| …久久精品99久久香蕉国产| 久久亚洲AV成人无码电影| 国产精品免费福利久久| 99久久精品费精品国产一区二区 |