詳解resize 的rehash部分

2021-08-17 18:41:58 字數 781 閱讀 8757

if ((e.hash & oldcap) == 0)

如果返回true,表示(e.hash & (oldcap - 1))和(e.hash & (newcap - 1))的結果是相同的

因為map容量必須是2次冪,並且翻倍擴容,所以oldcap和newcap是2的次冪,

並且newcap是oldcap的兩倍,就相當於oldcap的唯一乙個二進位制的1向高位移動了一位  (16 << 1)

預設容量是16,那麼就相當於e.hash & 0x1111 (oldcap - 1 = 15),

現在容量擴大了一倍,就是32,那麼rehash定位就等於e.hash & 0x11111 (newcap - 1 = 31)

陣列每次擴容都是原來的兩倍,所以每乙個元素在新陣列中的位置要麼是原來的index,要麼index = index + oldcap

假設陣列長度:2,key:3 

0 0 0 1 

0 0 1 1

結果為 0 0 0 1 = 1 所以陣列下標為1;

擴容後,陣列長度:4,key:3 

0 0 1 1 

0 0 1 1

結果為 0 0 1 1 = 3 = 原來的index + oldcap = 1 + 2

即確定元素在新陣列的下標時,我們只需要檢測元素的hash值與oldcap作與操作的結果是否為0

0,那麼下標還是原來的下標;

1,那麼下標等於原來下標加上舊陣列長度

Resize原始碼詳解 參考Opencv4 1

inline uint16x8 t v pack const uint32x4 t a,const uint32x4 t b uint16x4 t vqmovn u32 const uint32x4 t 飽和截斷每個lane值為原來的一半 uint16x8 t vcombine u16 const ...

resize和reverse的區別

首先,兩個函式的功能是有區別的 reserve是容器預留空間,但並不真正建立元素物件,在建立物件之前,不能引用容器內的元素,因此當加入新的元素時,需要用push back insert 函式。resize是改變容器的大小,並且建立物件,因此,呼叫這個函式之後,就可以引用容器內的物件了,因此當加入新的...

resize和reserve的區別

1 resize n 調整容器的長度大小,使其能容納n個元素。如果n小於容器當前的size,則刪除多出來的元素,否則,新增採用值初始化的元素。reserve n,t 多乙個引數t,將所有新新增的元素初始化為t。2 reserve n 預分配n個元素的儲存空間。capacity 容量 容器當前擁有的元...