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

小明思考

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

STL 備忘錄

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

[ 不斷補充中]

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

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

3. 將string轉為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有本質區別
??? find是查找子串在string出現的位置
??? find_first_of是查找第一個匹配目標字符串任何一個字符出現的位置。
??? (大多數的時候,需要的是find)

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

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

7. 了解各種儲存bool的優缺點
vector<bool> 第一,它不是一個真正STL容器,第二,它并不保存bool類(Effective STL 18條)
deque<bool> 不連續
vector<char> 太浪費
bitset 不能動態增長
boost::dynamic_bitset 不是標準

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

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

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

11. std::mem_fun/std::mem_fun_ref可以將成員函數用來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. 盡量用成員函數代替同名的算法

14. 循環中刪除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的成員函數getline做不到)

16.警惕string的引用記數技術實現帶來的潛在問題

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

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

17.自定義類放入stl容器中,應注意實現安全的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用于數組指針
auto_ptr<int> p(new int[10]); //maybe cause memory leak

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

21. 多線程下,幾個線程如果共同操作一個容器,安全性(鎖)應該由用戶自己來實現,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 備忘錄  回復  更多評論   

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

# re: STL 備忘錄  回復  更多評論   

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

# re: STL 備忘錄  回復  更多評論   

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

# re: STL 備忘錄  回復  更多評論   

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以節省空間.

# re: STL 備忘錄  回復  更多評論   

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

# re: STL 備忘錄  回復  更多評論   

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

# re: STL 備忘錄  回復  更多評論   

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

# re: STL 備忘錄  回復  更多評論   

2006-07-12 17:42 by 小明
恩,總結一下
vector<bool> Meyers不讓用
deque<bool> 不連續
vector<char> 太浪費
bitset 不能動態增長
boost::dynamic_bitset 不是標準

# re: STL 備忘錄  回復  更多評論   

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

# re: STL 備忘錄  回復  更多評論   

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

== 不應該用 &s[0],因為不能假設sting的內部實現的內存是連續的,但是 c_str()返回的則規范要求是連續的。

# re: STL 備忘錄  回復  更多評論   

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

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

# re: STL 備忘錄  回復  更多評論   

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

# re: STL 備忘錄  回復  更多評論   

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

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


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

# re: STL 備忘錄  回復  更多評論   

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>
            亚洲免费观看| 国内精品久久久| 野花国产精品入口| 亚洲人成网站色ww在线| 影音先锋欧美精品| 亚洲电影毛片| 日韩性生活视频| 99国产精品99久久久久久粉嫩| 亚洲精品综合精品自拍| 亚洲一区二区在线| 久久爱91午夜羞羞| 欧美不卡视频一区| 99成人免费视频| 欧美一区二区在线免费观看| 久久综合九色| 国产精品久久久久久av下载红粉| 国产亚洲精品v| 亚洲精品一区在线| 亚洲欧美精品伊人久久| 久久亚洲风情| 99av国产精品欲麻豆| 午夜精品福利电影| 欧美日韩亚洲视频一区| 在线观看日韩av| 先锋影院在线亚洲| 亚洲国产精品t66y| 亚洲欧美美女| 欧美日产国产成人免费图片| 国外成人在线视频网站| 亚洲午夜久久久久久久久电影院| 乱码第一页成人| 亚洲直播在线一区| 欧美日韩一区二区免费视频| 一区二区在线观看av| 午夜影院日韩| 亚洲免费av网站| 免费看精品久久片| 一区二区三区在线不卡| 亚洲欧美一区在线| 亚洲精品孕妇| 欧美二区在线播放| 亚洲国产二区| 嫩草成人www欧美| 久久精品电影| 国产综合色在线| 久久精品99无色码中文字幕| 亚洲午夜电影在线观看| 欧美视频一区在线观看| 日韩视频免费在线| 亚洲欧洲在线播放| 欧美日本一区二区视频在线观看| 亚洲人成人一区二区在线观看| 欧美成人免费在线| 蜜桃久久av| 亚洲三级电影全部在线观看高清| 欧美大片免费久久精品三p| 久久香蕉国产线看观看av| 黄色另类av| 欧美freesex8一10精品| 免播放器亚洲一区| 亚洲伦理在线免费看| 亚洲国产美国国产综合一区二区| 蜜臀av国产精品久久久久| 久久精品一二三区| 亚洲高清激情| 亚洲人成在线观看一区二区| 欧美大片免费| 中文一区字幕| 亚洲欧美视频在线观看视频| 国产在线不卡| 亚洲国产精品久久久久婷婷老年| 欧美激情1区2区3区| 在线亚洲伦理| 性欧美1819sex性高清| 精品99视频| 亚洲精品乱码| 国产欧美精品| 欧美高清视频一区二区三区在线观看| 欧美激情第六页| 欧美一区二区三区在线免费观看| 欧美在线一二三区| 亚洲美女av在线播放| 亚洲特黄一级片| 狠狠爱成人网| 一本久道久久综合婷婷鲸鱼| 国产嫩草一区二区三区在线观看 | 欧美sm重口味系列视频在线观看| 亚洲人成网站精品片在线观看| 亚洲美女精品久久| 国产亚洲精品v| 亚洲人体影院| 国产视频自拍一区| 亚洲人成7777| 激情综合色综合久久综合| 99在线精品免费视频九九视| 国产综合久久久久久| 亚洲久久一区| 亚洲福利在线观看| 性欧美8khd高清极品| 99精品欧美一区| 欧美在线一二三四区| 亚洲一区视频| 欧美jizz19hd性欧美| 欧美一区在线直播| 欧美视频亚洲视频| 欧美福利影院| 国模套图日韩精品一区二区| 日韩午夜激情| 亚洲国产日韩欧美在线图片| 亚洲欧美日韩国产另类专区| 日韩亚洲欧美成人一区| 久久国内精品自在自线400部| 亚洲视频导航| 欧美日本中文| 999在线观看精品免费不卡网站| 一区免费视频| 久久av一区二区| 久久精品视频免费| 国产欧美日韩精品丝袜高跟鞋| 日韩亚洲欧美成人| 日韩网站在线观看| 亚洲精品三级| 91久久夜色精品国产网站| 欧美伊人久久久久久午夜久久久久| 亚洲一区精品视频| 欧美日韩一区免费| 日韩网站在线观看| 在线视频精品一区| 欧美国产一区二区| 最新日韩在线| 一区电影在线观看| 欧美午夜三级| 亚洲香蕉成视频在线观看| 亚洲永久免费av| 国产精品欧美经典| 销魂美女一区二区三区视频在线| 午夜精品国产更新| 国产亚洲成年网址在线观看| 欧美一级淫片aaaaaaa视频| 久久久精品2019中文字幕神马| 国产视频一区在线观看一区免费| 欧美亚洲视频在线观看| 久久伊人精品天天| 亚洲欧洲日本国产| 欧美视频观看一区| 亚洲综合国产激情另类一区| 久久国产精品电影| 亚洲国产精品999| 欧美日韩精品在线| 亚洲欧美久久久| 老司机67194精品线观看| 亚洲黄色高清| 欧美亚州一区二区三区| 欧美亚洲午夜视频在线观看| 久久嫩草精品久久久久| 亚洲国产导航| 国产精品嫩草影院av蜜臀| 久久精品国产久精国产爱| 亚洲国产精品电影| 先锋影音一区二区三区| **欧美日韩vr在线| 国产精品v欧美精品v日韩 | 欧美日韩国产在线播放网站| 在线亚洲伦理| 久色成人在线| 亚洲一区视频| 亚洲国产综合视频在线观看| 国产精品欧美久久| 免费国产自线拍一欧美视频| 一区二区三区欧美亚洲| 久久亚洲春色中文字幕久久久| 亚洲免费观看高清完整版在线观看熊| 国产精品成av人在线视午夜片| 欧美一区免费| 亚洲图中文字幕| 亚洲国产福利在线| 久热精品视频在线观看一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产日韩欧美高清| 欧美日韩国产123| 久久精品国产久精国产思思| 一区二区三区国产| 亚洲国产精品嫩草影院| 久久精品99无色码中文字幕| 一区二区三区国产| 在线不卡视频| 国产欧美精品在线播放| 欧美日本二区| 欧美18av| 久久久久国产成人精品亚洲午夜| 欧美怡红院视频| 夜夜精品视频| 亚洲欧洲精品一区二区三区波多野1战4 | 午夜免费日韩视频| 亚洲三级免费| 国产一区清纯| 国产精品久久久久毛片大屁完整版 | 黄色国产精品| 国产欧美日韩激情| 国产精品免费aⅴ片在线观看|