關於std map的節點大小

2021-08-19 06:43:41 字數 848 閱讀 3324

專案中需要用到很大的map,於是想看一下map本身的儲存消耗是多少,於是寫了個最簡單的allocator來試。

以下myalloc的預設構造、(廣義的)複製構造、rebind是必需的,為了檢視分配空間的大小,allocate也是必需的。

用greater()顯式的構造map是為了說明,「c++盡可能將語句解釋為函式宣告」,語句

map,myalloc> > m(greater());
將被編譯器解釋為乙個函式宣告,形式引數是乙個省略名字的函式指標。

把形式引數的宣告用括號括起來是非法的,給函式引數加上括號卻是合法的,所以給greater()套上括號就可以了。

以下是完整**:

#include 

#include

using

namespace

std;

//#pragma pack(1)

template

class myalloc : public allocator

//用於構造myalloc

myalloc(){}

//使myalloc可用於紅黑樹節點

template

struct rebind

;//用於容器的get_allocator方法

template

myalloc(const myalloc& alloc){}

};int main()

gcc4.1.2中每個節點大小是24,在4.3.2,4.4.4,6.3中每個節點的大小是40。

可見如果key和value只是int,map本身的儲存開銷還是很大的。

關於std map中的find和 的問題

std map不是順序容器,這應該都知道的,map中過載了operator 操作符,可以用map的鍵值索引到相關的資料,但是這個和一般陣列的可不一樣。有的人又認為既然就是利用下標做索引和std map中的find用鍵值索引是不是一樣的,所以有的會寫出下面類似的 std mapmaptemp int ...

關於std map的第三個引數

預設為std less,即按 運算子進行排序 mapmapword 等價於 mapless mapword2 2 如果想把key值按從大到小的順序排序,改為 mapgreater mapword2 3 使用比較函式也可以 bool compfunc const string a,const stri...

std map特性的小技巧

typedef std pairkey std mapmaptest void functest for int i 0 i 10 i auto fnsearchbykey01 unsigned int keyfirst std unordered set return std move resse...