C++STL----容器高效使用
阿新 • • 發佈:2018-01-05
size pos 需要 註意 gpo 大量 表達 意圖 成員函數 1. 容器中對象拷貝高效、防剝離發生的方法:
使容器包含指針而不是對象。(ps:STL容器是在創建拷貝,相比數組,是動態創建,節省時間和空間)
2. 總是調用empty()而不是size==0來判斷容器是否為空:
empty()對所有STL容器都是常數時間操作,而size()對某些容器(如list)是線性時間操作,size()更耗時。
3. vector、list、deque的比較:
(1)vector是連續存儲結構,相比數組,多了動態內存管理。
優點是:支持高效的隨機訪問,支持尾端高效插入/刪除。占用內存小。
缺點是:首端和中間位置的插入/刪除效率低下。
(ps:vector擴充內存的步驟:①分配一塊更大的新內存 ②將原內存中數據復制到新內存 ③將原內存空間釋放給系統 )
(2)duque是連續存儲結構,相比vector,deque維護了容器的首端地址,故支持高效的首端插入/刪除操作。
優點是:支持高效的隨機訪問,支持首尾端高效插入/刪除。
缺點是:占用的內存大。
(3)list是非連續存儲結構,是雙向鏈表結構,每個節點維護其前後節點的地址,故支持前/後向遍歷。
優點是:不使用連續內存完成動態操作,支持任意位置高效的隨機插入/刪除。
缺點是:不能進行內部隨機訪問(不支持[]和.at()),占用的內存大。
(4)三者使用原則:
① 如果需要高效的隨機存取,而不在乎插入/刪除的效率,使用vector
② 如果需要大量高效的插入/刪除,而不在乎隨機存取時間,使用list
③ 如果需要高效的隨機存取,還要大量的首尾端插入/刪除,使用deque
4. 區間成員函數要優於對應的單元素成員函數:
區間成員函數,即:insert(iterator begin, iterator end)、erase(iterator begin, iterator end)、assign(iterator begin, iterator end)
單元素成員函數,即:push_back(元素)、push(元素)、insert(元素)、erase(元素)
使用區間成員函數的好處:代碼簡潔、容易表達意圖、效率高。
5. 容器中的元素類型是new出來指針類型,要註意:
需要記得容器使用完後,人工delete指針指向內存。或者用帶有引用計數的智能指針shared_ptr作為容器元素,可以不用人工釋放內存,避免內存泄露。(ps:切記不能使用auto_ptr,其不是引用計數的智能指針 )
C++STL----容器高效使用