本文的目的不是手把手教你如何理解deque(那得看書,看書是最全面的),在你大概理解了deque的設計之後,你可以結合本篇部落格,看看同我有多少共鳴多少分歧。
deque是雙向開口的動態陣列,同vector的顯著區別是:1)允許在常數時間內對頭端進行插入或刪除的操作;2)分段線性連續,所以擴容時不需要另闢空間--->拷貝--->釋放原有空間。結構設計決定其行為,乙個壞的結構搭配好的演算法也只能得到壞的結果,結構是重中之重。
queue之所以能與演算法搭配(例如copy,copy_backward等)的相得益彰,歸功於迭代器以及容器本身的設計。那迭代器好的設計體現在**呢?deque的迭代器需要自行設計而不應該繼承stl模板庫中的最原始的祖先,因為實現的功能不一樣。
differerce_type operator -(const self& x) const //迭代器間的距離。
bool operator < (const self& x) const //迭代器的比較。
為什麼我會把這兩個函式單獨拎出來呢?因為這困惑我好多天了。乙個很本質的問題泛型演算法為什麼能實現,正是因為是面向介面而不是面向實現程式設計!如何理解,比如說,每個容器可能都會有自己的專屬迭代器(視容器的需求而定,stack就沒有),那麼我將迭代器作為引數交給泛型演算法去使用的時候,泛型演算法才不會去區分什麼,例如當用到 < 運算子時,事先不是已經實現好相應版本了嗎?陣列+緩衝。
stl規定,區間必須左閉右開(半開半閉),這就有兩個結果,1)區間元素個數方便求得——右端點減去左端點;2)區間右端點永遠不能使用,因為區間右端點總是區間內可用元素的下一位置。
具體到迭代器中:
t *cur; //current
t *first; //緩衝區頭部。
t *last; //緩衝區尾部。
map_pointer node; //指向陣列。
那判斷迭代器是否相等,就是需要判斷4個成員是否全部相等。容器queue中包含兩個迭代器start,finish, (組合關係),start.cur指向緩衝區的首元素,finish.cur指向緩衝區已用元素的下一位置。區間左閉右開應該是乙個良好的規範,雖然不是強制的。
else //後方元素比較少。}}
為什麼要區分 [first, last) 前方元素個數和後方元素個數呢?為了效率——盡可能減少元素移動次數。儘管 deque 是分段線性連續的動態陣列,在邏輯上,仍然將其看成一整根方便理解。
1)前方元素個數較少
我們不妨將其想象成動態開闢的二維陣列, 那就很好理解了。
if( elems_before < (size() - n) / 2)
start = new_start;
}
需要體會:內容永遠是先析構再釋放空間不然可能會導致記憶體洩漏,我們是不應該將程式能否正確執行寄託於可能。
2)後方元素較少
finish = new_finish; //更新尾部標記。
}看圖的話,一目了然,在此不加贅述。
STL原始碼剖析
這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...
STL原始碼剖析
這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...
STL原始碼剖析
花了兩天時間略讀了一下 stl原始碼分析 看了個大體,對於細節並沒有深究。之所以想翻翻這本書,主要是想看看stl中的特性 介面卡的具體實現。看完之後收穫還是蠻大的,模板的各種組合讓我眼前一亮,下面大概總結一些內容。1.記憶體分配 sgi記憶體分配採用兩級實現,對於大記憶體塊的申請 大於128k 由第...