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 容量 容器當前擁有的元...