STL中的最有用的經驗總結(一)

2021-06-19 03:22:38 字數 1758 閱讀 5741

——整理自《effective stl》

一、確保容器中的拷貝操作是輕量級的。

理由:對於序列容器vector、deque和string等的插入或刪除(中間元素),會造成元素的移動(拷貝);排序演算法、next_permutation、previous_permutation、remove、unique、reverse等都會造成元素的拷貝。

因此,如果容器中元素太過複雜,如自定義的型別在拷貝的時候,拷貝會造成效能瓶頸。同時,如果以基類作構造乙個容易的時候,當你插入派生類的時候會預設強制轉換為基類型別,因此派生出來的部分就丟失了。

解決:使用物件的指標容器是乙個很好的解決方案。

如:vectorpvw;

二、用empty()代替size()檢查容器是否為0

理由:對於所有的標準容器,empty是乙個常數時間的操作,但對於一些list實現,size花費線性時間。

三、拷貝vector v2後半部分的元素到vector v1中去:

1)v1.assign(v2.begin() + v2.size() / 2, v2.end());//兩個迭代器指標指向拷貝的首尾位址。

assign是乙個很優秀的序列容器的成員函式。注意僅在vector、string、deque和list有效。

2)v1.insert(v1.end(), v2.begin() + v2.size() / 2, v2.end());

3)copy(v2.begin() + v2.size() / 2, v2.end(), back_inserter(v1));

4) vectorv1, v2; // 假設v1和v2是widget的vector

v1.clear();

for (vector::const_iterator ci = v2.begin() + v2.size() / 2;

ci != v2.end();

++ci)

v1.push_back(*ci);

效能依次降低!且手寫for迴圈**不簡潔,易出錯。

四、當使用new得指標的容器時,記得在銷毀容器前delete那些指標

理由:指標容器在作用域結束的時候只會釋放容器中的指標,不會釋放指標指向的堆空間。

五、刪除容器中元素的技巧

1)連續記憶體容器(vector 、deque或string)方法:eraser-remove法

如有容器containerc;

刪除容器中值為1963的所有物件:c.erase(remove(c.begin(),c.end(),1963),c.end());

該方法同樣適用於list,具體步驟都是首先從後往前依次覆蓋掉值為1963的節點,然後呼叫erase擦出移動後尾巴上多餘的節點(實際上並沒有清空這塊記憶體,而是講end指標前移)。但是考慮到list特殊的資料結構,因此使用list的成員函式remove更有效。

2)關聯容器(set、multiset、map或multimap)

不是線性的,最好不使用remove方法,可能會覆蓋容器值,因此刪除最好使用erase,對數時間

c.erase(1963);//當c是標註關聯容器時,這是最佳方法。

未完待續.....

STL中的最有用的經驗總結(二)

一 stl容器不能保證執行緒安全 解釋 在執行改寫容器中內容的語句的時候,stl不能保證結果的唯一性。當然,多執行緒的併發讀操作是執行緒安全的。常見的寫操作包括 插入 push 彈出 pop 刪除 erase clear 賦值 p 3 等,因此在多個執行緒併發改寫容器內容的時候,要加鎖保證執行緒的同...

學習中的經驗總結

1.要學習某個領域的時候,先看文獻綜述,了解該方向的大體趨勢和內容,再根據需要重點看其中的某些演算法 2.寫 作業時,要知道老師要求的重點在 雖然內容很重要,但格式基本不能出錯,畢竟是不用動腦子的部分,不是嗎?要聽話,不要自以為是。3.專業書籍千萬千萬不要丟掉,尤其是自己的筆記 本科畢業的時候把所有...

在公司的經驗總結

1 團隊真的很重要,我以前總是喜歡乙個人做事情,因為有美術功底,所以有時候自己先切圖,然後再寫 但是效果往往不佳,因為我畢竟不是專門搞美術的。2 千萬不要在公司人員前說他們做的事情很簡單,就算他們做的事情真的很簡單。3 如果老闆問你有什麼自己的想法,如果你的想法與公司的業務不相關,你最好別說。4 不...