面試總結3 STL問題

2021-07-06 08:39:15 字數 1687 閱讀 4468

1、

為何map

和set

的插入刪除效率比用其他序列容器高?

因為對於關聯容器來說,不需要做記憶體拷貝和記憶體移動。說對了,確實如此。map和set容器內所有元素都是以節點的方式來儲存,其節點結構和鍊錶差不多,指向父節點和子節點。因此插入的時候只需要稍做變換,把節點的指標指向新的節點就可以了。刪除的時候類似,稍做變換後把指向刪除節點的指標指向其他節點就ok了。這裡的一切操作就是指標換來換去,和記憶體移動沒有關係。

2

、為何每次insert之後,以前儲存的iterator不會失效?

iterator

這裡就相當於指向節點的指標,記憶體沒有變,指向記憶體的指標怎麼會失效呢(當然被刪除的那個元素本身已經失效了)。相對於vector來說,每一次刪除和插入,指標都有可能失效,呼叫push_back在尾部插入也是如此。因為為了保證內部資料的連續存放,iterator指向的那塊記憶體在刪除和插入過程中可能已經被其他記憶體覆蓋或者記憶體已經被釋放了。即使時push_back的時候,容器內部空間可能不夠,需要一塊新的更大的記憶體,只有把以前的記憶體釋放,申請新的更大的記憶體,複製已有的資料元素到新的記憶體,最後把需要插入的元素放到最後,那麼以前的記憶體指標自然就不可用了。特別時在和find等演算法在一起使用的時候,牢記這個原則:不要使用過期的iterator。

3

、為何map和set不能像vector一樣有個reserve函式來預分配資料?

引起它的原因在於在map和set內部儲存的已經不是元素本身了,而是包含元素的節點。也就是說map內部使用的alloc並不是map宣告的時候從引數中傳入的alloc。例如:map, alloc> set、map;這時候在set、map中使用的allocator並不是alloc, 而是通過了轉換的alloc,具體轉換的方法時在內部通過alloc::rebind重新定義了新的節點分配器,詳細的實現參看徹底學習stl中的allocator。其實你就記住一點,在map和set內面的分配器已經發生了變化,reserve方法你就不要奢望了。

4、hash_map

和map

的區別在**?什麼時候需要用

hash_map

,什麼時候需要用

map?

建構函式。hash_map需要hash函式,等於函式;map只需要比較函式(小於函式).

儲存結構。hash_map採用hash表儲存,map一般採用 紅黑樹(rb tree)

實現。因此其memory資料結構是不一樣的。

總體來說,

hash_map

查詢速度會比

map快,而且查詢速度基本和資料資料量大小,屬於常數級別;而

map的查詢速度是

log(n)

級別。並不一定常數就比

log(n)

小,hash

還有hash

函式的耗時,明白了吧,如果你考慮效率,特別是在元素達到一定數量級時,考慮考慮

hash_map

。但若你對記憶體使用特別嚴格,希望程式盡可能少消耗記憶體,那麼一定要小心,

hash_map

可能會讓你陷入尷尬,特別是當你的

hash_map

物件特別多時,你就更無法控制了,而且

hash_map

的構造速度較慢

C 提高程式設計 3 STL常用容器

3.1 string容器 3.1.1 string基本概念 本質 string是c 風格的字串,而string本質上是乙個類 string和char 區別 1 char 是乙個指標 2 string是乙個類,類內封裝了char 管理這個字串,是乙個char 型的容器。特點 string類內封裝了很多...

面試總結 3

1.請列舉你能想到的unix訊號,並說明訊號用途 2.有乙個ip位址,192.168.0.1,請寫出其32位無符號整數形式 3.請寫出http頭,並符合以下要求 a 這是乙個post請求 b 目標 c post變數 username test pwd test2 intro hello world ...

spark面試總結3

spark core面試篇03 1.spark使用parquet檔案儲存格式能帶來哪些好處?如果說hdfs 是大資料時代分布式檔案系統首選標準,那麼parquet則是整個大資料時代檔案儲存格式實時首選標準 速度更快 從使用spark sql操作普通檔案csv和parquet檔案速度對比上看,絕大多數...