• <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>
            posts - 131, comments - 12, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            1
            程序段:
            1
            2
            3
            4
            5
            6
            7
            vector <int> vecInt;
            for (int i=0;i<500;i++)
            {
                vecInt.push_back(i);
            }
            int j= vecInt.capacity();  //j=512
            i = vecInt.size(); //i=500
            1
              

            辦法1 : 使用 clear ,清空元素,但不回收空間.

            1
            2
            3
            vecInt.clear();
            j= vecInt.capacity();  //j=512
            i = vecInt.size();     //i=0
            1
              

            方法2 : 使用 erase循環(huán)刪除,結(jié)果同上.

            1
            2
            3
            4
            5
            6
            7
            vector <int>::iterator iter=vecInt.begin();
            for ( ;iter!=vecInt.end();)
            {
                iter=vecInt.erase(iter);
            }
            j= vecInt.capacity();  //j=512
            i = vecInt.size();     //i=0

            erase在每次操作時,迭代器指針會整體前移1,就是每次都會“搬”全部數(shù)據(jù),所以vector不適合做頻繁刪除的容器.


            方法3 :  使用clear和swap.

                先使用vecInt.clear()清空, 再使用swap,釋放空間回收內(nèi)存.

            (先vec.clear()再vec->swap( (std::vector <temp>)(vec) ),就能實現(xiàn)清空vector和釋放原來vector的內(nèi)存)

            1
            2
            3
            4
            vector <int>().swap(vecInt);    //清除容器并最小化它的容量,
            // vecInt.swap(vector<int>()) ; //另一種寫法
            j= vecInt.capacity();           //j=0
            i = vecInt.size();              //i=0

            該語句是由vector <int>(vecInt).swap(vecInt)的變體而來.

            以下解釋引自CSDN:
            std::vector<T>(v).swap(v);的作用相當(dāng)于: 

            std::vector<T> temp(v);  //1   產(chǎn)生一個和v內(nèi)容一模一樣的vector,只不過temp的容量是恰好滿足其大小 
            temp.swap(v);                 //2  把v和temp交換

            第一句產(chǎn)生一個和v內(nèi)容一模一樣的vector,只不過temp的容量是恰好滿足其大小的 
            第二句把v和temp交換 
            然后temp就自動解析掉了 
            這樣寫的作用是:把v的容量縮小到最佳值
            該例中執(zhí)行這句時,capacity收縮到500,若要收縮到0,需要先clear數(shù)據(jù),再swap.
            ××××××××××××××××××××××
            不過以上還是調(diào)用stl的函數(shù)看到的,不知其內(nèi)部是如何做的。在網(wǎng)上看到其他人的討論有這樣:
            @@而Cygwin中的GCC用的應(yīng)該是HP STL或從它繼承來的SGI STL,對于小內(nèi)存有一種緩沖池機制,一旦進池的內(nèi)存就再也不會交還給系統(tǒng)了
            @@swap 不起作用, 因為原因是 allocator.
            from:http://blog.csdn.net/metalkittie/archive/2008/10/21/3115750.aspx

            注意 clear 不會自動調(diào)用 vector中的成員的析構(gòu)函數(shù),指針數(shù)據(jù)的內(nèi)存需要自己來釋放。


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            午夜精品久久久内射近拍高清 | 国产亚洲色婷婷久久99精品91 | 一本一本久久a久久综合精品蜜桃| AAA级久久久精品无码片| 综合网日日天干夜夜久久 | 亚洲成色WWW久久网站| 久久乐国产综合亚洲精品| 人妻少妇精品久久| 久久伊人五月天论坛| 久久青青草原精品国产不卡| 久久国产综合精品五月天| 青草影院天堂男人久久| 国产精品久久毛片完整版| 狠狠狠色丁香婷婷综合久久五月| 国产人久久人人人人爽| 国产午夜免费高清久久影院 | 国产精品无码久久四虎| 久久99精品国产麻豆蜜芽| 国产免费久久精品99久久| 久久99精品久久久久久秒播 | 亚洲国产精品成人久久蜜臀 | 亚洲综合久久综合激情久久| 91亚洲国产成人久久精品| 精品无码久久久久久久动漫| 日本高清无卡码一区二区久久| 亚洲精品乱码久久久久久不卡| 国产aⅴ激情无码久久| 久久久久AV综合网成人| 亚洲国产精品人久久| 青青草原综合久久大伊人导航| 久久人妻AV中文字幕| 国内精品人妻无码久久久影院| 成人国内精品久久久久影院VR| 久久久久97国产精华液好用吗| 久久无码专区国产精品发布| 久久99国产综合精品免费| 色综合久久88色综合天天| 伊人久久大香线蕉成人| 精品无码久久久久久午夜| 久久精品国产99久久丝袜 | 久久精品国产亚洲精品2020|