青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小明思考

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

STL 備忘錄

Posted on 2006-07-12 11:19 小明 閱讀(5697) 評論(14)  編輯 收藏 引用 所屬分類: C/C++

[ 不斷補充中]

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

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

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

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

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

6. 用vector<char>來儲存二進制流

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

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

9. vector 的at方法會進行邊界檢查,[]操作符則不會

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

11. std::mem_fun/std::mem_fun_ref可以將成員函數(shù)用來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元素的寫法
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ù)實現(xiàn)帶來的潛在問題

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

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

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

18.避免iterator失效,不提取無效的iterator
比如:
vector<int> iv;
vector<int>::iterator end = iv .end();
for(int i=0;i<10;++i)
??? iv.insert(end,i);
會crash ,因為end指針,隨著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. 多線程下,幾個線程如果共同操作一個容器,安全性(鎖)應(yīng)該由用戶自己來實現(xiàn),stl不保證這一點
例如,一個多線程安全的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ù)  更多評論   

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

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

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

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

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

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

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

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

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

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

2006-07-12 17:22 by 3×7=51
Meyers說的俺知道,可是vector<bool>自然還有它的用途,我們不能因為它不能用在A處,所以就也不把它用于B處。

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

2006-07-12 17:29 by 小明
因為Meyers說過,所以我就不敢用vector<bool>了,我想bitset總是可以替代vector<bool>了。Meyers也來提到了用deque<bool>來代替
所以不用vector<bool>是一種保險/安全的做法。
安全/穩(wěn)妥第一。

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

2006-07-12 17:34 by 3×7=51
bitset試無法替代vector<bool>因為它無法動態(tài)增長。而如果使用deque<bool>則一樣無法保證begin到end之間空間的連續(xù)。所以似乎也沒多大的用處。而bitset跟vector<bool>一樣是用位域來表示bool的。

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

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

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

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

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

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],因為不能假設(shè)sting的內(nèi)部實現(xiàn)的內(nèi)存是連續(xù)的,但是 c_str()返回的則規(guī)范要求是連續(xù)的。

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

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

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

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

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

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

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

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


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

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

2007-12-17 17:05 by 秦歌
頂!
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久久久久一区二区| 久久婷婷色综合| 亚洲网站在线| 欧美成人自拍| 欧美一区午夜视频在线观看| 欧美日韩国产一区| 亚洲三级电影在线观看| 另类激情亚洲| 久久国产精品久久精品国产| 国产精品亚洲激情| 亚洲一区美女视频在线观看免费| 欧美xxxx在线观看| 久久久久久久久伊人| 国产视频精品xxxx| 久久精品亚洲精品国产欧美kt∨| 亚洲欧美日韩在线高清直播| 国产精品视频九色porn| 香蕉久久夜色精品国产使用方法| 亚洲伊人伊色伊影伊综合网| 国产精品美女黄网| 久久精品二区| 久久久综合视频| 亚洲欧洲一区二区三区久久| 亚洲国产另类久久久精品极度| 欧美岛国在线观看| 亚洲视频在线观看网站| 在线视频精品| 国产午夜精品美女视频明星a级| 久久久夜色精品亚洲| 女主播福利一区| 中日韩视频在线观看| 亚洲性人人天天夜夜摸| 国产欧美日韩一区二区三区| 可以看av的网站久久看| 欧美国产日韩a欧美在线观看| 亚洲神马久久| 欧美伊久线香蕉线新在线| 亚洲国产欧美久久| 亚洲少妇中出一区| 好看的日韩视频| 亚洲国产精品日韩| 国产精品亚洲视频| 蜜臀91精品一区二区三区| 欧美承认网站| 欧美亚洲视频| 欧美国产精品劲爆| 欧美一区二区三区四区视频| 久久久久久夜精品精品免费| av不卡在线观看| 欧美影院成人| 亚洲影音一区| 麻豆成人小视频| 午夜精品久久久| 免费在线观看日韩欧美| 欧美一级日韩一级| 欧美精品久久99| 久久视频在线看| 欧美日韩网址| 亚洲二区视频在线| 国产亚洲一区二区三区在线观看| 亚洲国产一区在线观看| 久久成人综合视频| 亚洲国产你懂的| 久热精品视频在线观看一区| 久久精品2019中文字幕| 国产视频欧美视频| 美女精品一区| 欧美激情亚洲国产| 一本一本久久| 国产综合一区二区| 欧美视频日韩| 一区二区三区国产| 亚洲在线视频免费观看| 欧美性猛片xxxx免费看久爱| 久久久久国产一区二区| 欧美日韩福利| 麻豆9191精品国产| 国产久一道中文一区| 亚洲精品网址在线观看| 影音先锋国产精品| 欧美一区二区三区的| 亚洲午夜免费视频| 欧美黄色aa电影| 免费在线观看精品| 国产一区二区精品在线观看| 亚洲视频一区| 一区二区三区欧美亚洲| 欧美承认网站| 亚洲第一福利视频| 亚洲国产mv| 久久久久一区二区三区四区| 久久久久久伊人| 国产欧美日韩一级| 性伦欧美刺激片在线观看| 欧美亚洲午夜视频在线观看| 国产精品乱码一区二三区小蝌蚪| 一本久道久久综合中文字幕| 亚洲午夜在线| 国产精品日韩欧美综合| 在线一区欧美| 亚洲香蕉成视频在线观看| 欧美国产日韩a欧美在线观看| 一本久久青青| 亚洲一区二区三区在线观看视频| 亚洲欧美日韩一区| 欧美精品一区二区蜜臀亚洲| 国产精品一区二区三区久久| 亚洲毛片av在线| 久久精品最新地址| 日韩亚洲成人av在线| 亚洲新中文字幕| 国产麻豆9l精品三级站| 亚洲欧美激情视频| 欧美在线亚洲| 伊人色综合久久天天| 欧美mv日韩mv国产网站| 女同性一区二区三区人了人一 | 久久男人av资源网站| 国产一区三区三区| 老司机免费视频久久| 最新国产拍偷乱拍精品| 一本色道久久综合亚洲精品按摩 | 亚洲欧洲精品一区二区三区不卡 | 亚洲午夜视频在线观看| 国产农村妇女精品一二区| 久久精品人人| 91久久精品国产91性色tv| 亚洲欧美资源在线| 加勒比av一区二区| 欧美激情网友自拍| 亚洲综合视频1区| 免费不卡在线观看| 亚洲一二三四区| 揄拍成人国产精品视频| 国产精品mm| 美女久久一区| 午夜日韩在线| 亚洲人午夜精品| 久久资源在线| 亚洲一级在线| 亚洲国产精品专区久久| 国产精品揄拍500视频| 免费日韩成人| 欧美与欧洲交xxxx免费观看| 亚洲经典一区| 蜜臀久久99精品久久久久久9| 亚洲免费婷婷| 国产精品久久久久久久7电影| 久久综合色天天久久综合图片| 中文一区字幕| 亚洲精品黄色| 亚洲高清色综合| 欧美成人嫩草网站| 久久久精品日韩欧美| 亚洲一区二区动漫| 亚洲免费激情| 91久久久久久国产精品| 黄色小说综合网站| 国产欧美日韩91| 国产精品国产亚洲精品看不卡15 | 欧美在线视频免费观看| 一区二区三区www| 最新国产成人av网站网址麻豆| 你懂的国产精品| 狼人社综合社区| 欧美综合国产| 亚洲男女自偷自拍| 亚洲永久精品国产| 亚洲午夜av电影| 亚洲五月婷婷| 亚洲综合成人婷婷小说| 亚洲视频一二| 久久国产精品久久w女人spa| 亚洲午夜极品| av不卡在线看| 一本综合久久| 一区二区三区精品视频在线观看 | 久久亚洲高清| 久久久久久有精品国产| 久久久久久久久一区二区| 久久精品色图| 欧美一级淫片播放口| 久久久久久综合网天天| 亚洲精品免费观看| 久久精品国产一区二区三| 亚洲午夜一区二区三区| 欧美国产精品日韩| 欧美1区3d| 在线观看亚洲视频| 久久精品一二三| 久久精品视频在线看| 国产精品久久久久久久久动漫| 久久久夜夜夜| 久久精品一区二区三区不卡| 欧美一级淫片播放口| 欧美一区二区三区播放老司机 | 欧美激情国产日韩| 欧美二区视频| 欧美日韩视频不卡| 国产欧美日韩91|