STL原始碼剖析(一)

2021-09-29 10:39:52 字數 1477 閱讀 6187

新開了個坑,侯捷的stl原始碼剖析。

其實最開始想看原始碼是因為用string用的不熟悉,不知道裡面有哪些函式,也不知道用了函式裡面儲存層會變成什麼樣。比如對string用+=會發生什麼,重新分配記憶體還是用指標指向新開的記憶體,strlen的複雜度到底是不是o(n)等等,然後就買了侯捷的這本書,結果到手後發現沒有string,這就比較坑,想著好歹是買了書,就先看看別的stl的實現吧。就這樣。

先看第一遍,只分析stl裡面函式/容器的實現思路,不涉及具體**的分析,所以寫的很簡略。

不過聽說stl**有很多奇淫技巧,有時間還是需要讀第二遍的。

第一遍可能有些地方看的不是很透徹,歡迎**。

第二章空間配置據說新版stl更改了分配器,所以就沒看,直接跳過去了。

第三章用法和陣列一樣,特點是不需要提前知道陣列大小,可以自動增長空間,但是需要手動縮小。

也不能說是震驚吧,就是之前沒想過,erase函式需要進行記憶體的拷貝

由於和陣列過於接近,迭代器也變成了普通指標的模樣

每次分配記憶體空間的時候,都比要求的空間要大一點。每次塞滿的時候都會比之前的空間大一倍。這裡需要注意的是,vector會新分配空間,並將元空間的資料拷貝到新空間上來。這就造成了,一旦引起空間重新配置,指向源vector的所有迭代器就失效了。

沒啥好說的,雙向鍊錶。

我一直以為雙向佇列是和vector一樣,滿了之後進行空間的重分配,結果好像不是這樣。它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並鏈結起來。這就避免了重新分配/銷毀空間帶來的時間損失,但是問題是排序和管理變的超麻煩。

所以書上說,如果要對deque進行排序,為了最高效率,可將deque先完整複製到乙個vector身上,將vector排序後(可利用stl sort),再複製回deque。可見排序的麻煩。

先看下管理。

其中,map是主控(非stl map),裡面存的是分配好的一塊一塊的小空間(緩衝區),緩衝區記憶體的是真正deque裡面存放的資料。當緩衝區滿了以後,就申請一塊新的緩衝區,並把新緩衝區的位址放在map裡。當map滿了之後,和vector一樣,重新分配空間,拷貝資料,不過至於空間是不是double size,書上沒說。 所以排序慢不是沒有理由的。

初始化的時候,預設分配乙個緩衝區的空間,預設大小為512bytes。

當一塊緩衝區空了之後(刪空的),deque會主動進行空間的**,但是剩最後一塊緩衝區的時候不會進行**,也就是說會留下最後一塊緩衝區。

後進先出。基於上面說的deque,底層呼叫的都是deque的**。

先進先出。同棧,基於上面說的deque,底層呼叫的都是deque的**。

STL原始碼剖析(一)STL簡介

最近看了一點 stl原始碼剖析 這本書,覺得寫得很不錯,寫個部落格記錄下。本篇主要介紹stl的歷史 意義。stl是c 的乙個標準程式庫,其具有劃時代的意義。因為stl包含了先進的技術和程式設計思想。stl價值在於 製造臨時物件的方法是,在型別之後加小括號,並可指定初始值,如shape 3,5 等。相...

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...

STL原始碼剖析

這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...