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

            小明思考

            高性能服務(wù)器端計(jì)算
            posts - 70, comments - 428, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            STL 備忘錄

            Posted on 2006-07-12 11:19 小明 閱讀(5677) 評(píng)論(14)  編輯 收藏 引用 所屬分類(lèi): C/C++

            [ 不斷補(bǔ)充中]

            1. string.empty() 不是用來(lái)清空字符串,而是判斷string是否為空,清空使用string.clear();

            2. string.find等查找的結(jié)果要和string::npos比較,而不是和-1比較。(各個(gè)平臺(tái)可能不同)

            3. 將string轉(zhuǎn)為char * ,用char * t = (char *)s.c_str() ,而不是 char *t =s.begin() 或者 char *t = &s[0] 或者 char *t =s.data();

            4. 不要用錯(cuò)string.find ,string::find_first_of ,find和find_first_of有本質(zhì)區(qū)別
            ??? find是查找子串在string出現(xiàn)的位置
            ??? find_first_of是查找第一個(gè)匹配目標(biāo)字符串任何一個(gè)字符出現(xiàn)的位置。
            ??? (大多數(shù)的時(shí)候,需要的是find)

            5. 用swap技巧來(lái)移去string(vector)多余的空間
            ?? vector<int> v ;
            ?? ...
            ?? vector<int>(v).swap(v);

            6. 用vector<char>來(lái)儲(chǔ)存二進(jìn)制流

            7. 了解各種儲(chǔ)存bool的優(yōu)缺點(diǎn)
            vector<bool> 第一,它不是一個(gè)真正STL容器,第二,它并不保存bool類(lèi)(Effective STL 18條)
            deque<bool> 不連續(xù)
            vector<char> 太浪費(fèi)
            bitset 不能動(dòng)態(tài)增長(zhǎng)
            boost::dynamic_bitset 不是標(biāo)準(zhǔn)

            8. vector resize()和reserve()分別和size和capacity對(duì)應(yīng),不要搞錯(cuò)

            9. vector 的at方法會(huì)進(jìn)行邊界檢查,[]操作符則不會(huì)

            10. 使用iterator的時(shí)候,自增或者自減,多使用++iter ,--iter的格式。

            11. std::mem_fun/std::mem_fun_ref可以將成員函數(shù)用來(lái)for_each等方法。
            ?std::vector<Employee> emps;
            ?std::for_each(emps.begin(), emps.end(),
            ??????? std::mem_fun_ref(&Employee::DoStandardRaise);

            ?std::vector<Employee*> emp_ptrs;
            ?std::for_each(emp_ptrs.begin(), emp_ptrs.end(),
            ????????????? std::mem_fun(&Employee::DoStandardRaise));

            12. 如何刪除?
            vector:
            ?vector<int> v;
            ?v.erase(remove(v.begin(), v.end(), 99), v.end());

            list:
            ?list<int> li;
            ?li.remove(99);

            13. 盡量用成員函數(shù)代替同名的算法

            14. 循環(huán)中刪除map元素的寫(xiě)法
            typedef map<int,int> mymap;
            typedef map<int,int>::iterator myiter;
            mymap m;??? m[1] = 2;??? m[2] = -1;??? m[3] = 3;??? m[4] = 0;??? m[5] = -5;??? m[6] = 1;
            myiter iter = m.begin();

            ??? while(iter!=m.end())??? {
            ??????? if(iter->second<0)???
            ??????????? m.erase(iter++);
            ??????? else????
            ??????????? ++iter;
            ??? }

            15. 從ifstream讀出一行到string,使用std::getline(ifstream的成員函數(shù)getline做不到)

            16.警惕string的引用記數(shù)技術(shù)實(shí)現(xiàn)帶來(lái)的潛在問(wèn)題

            string greet("Hello, world");
            string hi(greet);
            char *ptr = (char *)hi.c_str();
            ptr[0] = 'h';
            兩個(gè)字符串都被修改。

            在多線程之間引用多個(gè)有關(guān)系的string,可能導(dǎo)致引用計(jì)數(shù)失效,造成多次刪除,或者memory leak.
            保險(xiǎn)的做法是:
            string s1("hello") ; string s2 (s1.c_str()); //force copy
            ?

            17.自定義類(lèi)放入stl容器中,應(yīng)注意實(shí)現(xiàn)安全的copy ctor和assign operator.尤其是含有指針的class,避免多次刪除

            18.避免iterator失效,不提取無(wú)效的iterator
            比如:
            vector<int> iv;
            vector<int>::iterator end = iv .end();
            for(int i=0;i<10;++i)
            ??? iv.insert(end,i);
            會(huì)crash ,因?yàn)閑nd指針,隨著insert后可能失效
            改為:
            vector<int> iv;
            for(int i=0;i<10;++i)
            ??? iv.insert(iv.end(),i);
            或者:
            vector<int> iv;
            for(int i=0;i<10;++i)
            ??? iv.push_back(i); //prefer


            19. 不要把std::auto_ptr用于數(shù)組指針
            auto_ptr<int> p(new int[10]); //maybe cause memory leak

            20. 不要直接修改set,map的鍵值,如果要修改,先erase,再insert.

            21. 多線程下,幾個(gè)線程如果共同操作一個(gè)容器,安全性(鎖)應(yīng)該由用戶自己來(lái)實(shí)現(xiàn),stl不保證這一點(diǎn)
            例如,一個(gè)多線程安全的deque
            template<typename T,class ThreadModel=MultiThread>
            class CDequePool:private ThreadModel {
            ??private:
            ???std::deque<T> m_clDeque;?
            //.....???
            ??public:
            ???bool PutData(const T &data)
            ???{
            ????Lock();
            ????m_clDeque.push_front(data);
            ????Unlock();
            ????return true;
            ???}
            //....
            }

            Feedback

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-12 11:34 by 周星星
            up一下

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-12 15:47 by Arcrest
            呵呵,都是Effective STL里面的條目啊
            那個(gè)12點(diǎn)有點(diǎn)詭異,也容易忘記,不過(guò)知道remove的原理就容易記住了

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-12 16:10 by 3×7=51
            第7條我表示反對(duì),即使它是Meyers說(shuō)的。我更愿意把它改為"了解vector<bool>的特殊之處"

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-12 16:38 by 小明
            Meyers說(shuō)到:
            做為一個(gè)STL容器,vector<bool>有兩個(gè)問(wèn)題.第一,它不是一個(gè)真正STL容器,第二,它并不保存bool類(lèi)型.

            vector<bool> v;
            bool *pb = &v[0]; // initialize a bool* with the address of
            // what vector<bool>::operator[] returns

            但是它不能編譯.不能的原因是vector<bool>是一個(gè)偽容器(pseudo-container),它并不保存真正的bool,而是打包bool以節(jié)省空間.

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-12 17:22 by 3×7=51
            Meyers說(shuō)的俺知道,可是vector<bool>自然還有它的用途,我們不能因?yàn)樗荒苡迷贏處,所以就也不把它用于B處。

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-12 17:29 by 小明
            因?yàn)镸eyers說(shuō)過(guò),所以我就不敢用vector<bool>了,我想bitset總是可以替代vector<bool>了。Meyers也來(lái)提到了用deque<bool>來(lái)代替
            所以不用vector<bool>是一種保險(xiǎn)/安全的做法。
            安全/穩(wěn)妥第一。

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-12 17:34 by 3×7=51
            bitset試無(wú)法替代vector<bool>因?yàn)樗鼰o(wú)法動(dòng)態(tài)增長(zhǎng)。而如果使用deque<bool>則一樣無(wú)法保證begin到end之間空間的連續(xù)。所以似乎也沒(méi)多大的用處。而bitset跟vector<bool>一樣是用位域來(lái)表示bool的。

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-12 17:42 by 小明
            恩,總結(jié)一下
            vector<bool> Meyers不讓用
            deque<bool> 不連續(xù)
            vector<char> 太浪費(fèi)
            bitset 不能動(dòng)態(tài)增長(zhǎng)
            boost::dynamic_bitset 不是標(biāo)準(zhǔn)

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-12 18:21 by 3×7=51
            不,我不覺(jué)得vector<bool>不可以使用,相反我們可以大膽地使用,反正如果象Meyers說(shuō)的那種誤用了會(huì)報(bào)錯(cuò)(是否會(huì)報(bào)錯(cuò)我不確定,是看你們說(shuō)的,反正我從沒(méi)那樣用過(guò))。

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-14 11:25 by darkay
            3. 將string轉(zhuǎn)為char * ,用char * t = (char *)s.c_str() 或者 char *t = &s[0] ,而不是 char *t =s.begin();

            == 不應(yīng)該用 &s[0],因?yàn)椴荒芗僭O(shè)sting的內(nèi)部實(shí)現(xiàn)的內(nèi)存是連續(xù)的,但是 c_str()返回的則規(guī)范要求是連續(xù)的。

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-07-14 13:38 by 小明
            @darkay
            ok,我修改第3條,謝謝

            @3×7=51
            我修改了第7條,謝謝

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-10-14 21:16 by 羅賓李
            不錯(cuò)。
            用swap技巧應(yīng)該是
            vector<int>().swap(v);

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2006-10-16 10:03 by 小明
            @羅賓李

            表達(dá)式vector<int>(v)創(chuàng)建一個(gè)臨時(shí)的vector,它是v的拷貝:vector的拷貝構(gòu)造函數(shù)完成這一工作.但是vector的拷貝構(gòu)造函數(shù)僅申請(qǐng)適合需要的空間來(lái)復(fù)制.因此臨時(shí)vector不包含多余空位.然后交換臨時(shí)對(duì)象和v的數(shù)據(jù),結(jié)果臨時(shí)對(duì)象包含著過(guò)多的空間,這些空間曾經(jīng)是v的,最后,臨時(shí)對(duì)象銷(xiāo)毀,并釋放空間.Yes,收縮至合適.


            所以vector<int>(v).swap(v); 是正確的

            # re: STL 備忘錄  回復(fù)  更多評(píng)論   

            2007-12-17 17:05 by 秦歌
            頂!
            久久久久亚洲AV成人网人人网站 | 狠狠色丁香婷婷久久综合不卡| 亚洲精品无码成人片久久| 亚洲精品乱码久久久久久| 国产精品99久久99久久久| 久久国产高清一区二区三区| 亚洲综合久久久| 久久精品国产精品国产精品污| 久久久久亚洲AV综合波多野结衣| 伊人久久大香线蕉AV色婷婷色| 亚洲国产二区三区久久| 波多野结衣久久一区二区| 精品国产91久久久久久久| 国产精品一区二区久久精品涩爱| 久久久久久狠狠丁香| 亚洲欧美日韩中文久久| 国内精品久久久久久不卡影院| 久久国产亚洲精品无码| 欧美日韩精品久久免费| 久久99精品久久久久久不卡| 狠狠色丁香婷综合久久| 久久久久久毛片免费播放| 狠狠色丁香久久婷婷综合蜜芽五月| 久久精品国产99国产电影网 | 免费国产99久久久香蕉| 亚洲精品无码久久久久去q| 精品久久久久久无码不卡| 狠狠久久综合| 国产福利电影一区二区三区久久久久成人精品综合 | 久久AV高潮AV无码AV| 久久久精品日本一区二区三区| 久久精品一区二区三区不卡| 色偷偷88888欧美精品久久久| 一本大道久久香蕉成人网| 久久亚洲中文字幕精品一区| 国产精品99久久久久久宅男| 久久久青草青青亚洲国产免观| 国产韩国精品一区二区三区久久| 久久久久久国产精品免费无码| 久久综合给合久久国产免费| 亚洲va久久久噜噜噜久久男同|