專案中需要用到很大的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...