c map部分用法關鍵點的記錄

2021-10-10 04:14:43 字數 2263 閱讀 3757

c++中map資料結構為紅黑樹(平衡二叉樹的一種特化),搜尋的複雜度為o(logn),其他的操作不在此敘述,讀者可以自行在msdn上查詢詳細欄位和函式的含義及用法示例。

每個節點資料構成如下,

x64環境下,乙個空的map大小為24個位元組,與上圖對應,

乙個節點占用記憶體為24個位元組。

如下圖,對於乙個初始化的map,其head節點,以及head節點中的left、right、parent節點值是一樣的,並且是是遞迴重複的,由此推斷,初始化僅有乙個節點(下文的輸出資訊會佐證),節點中left、right、parent都指向了自己。

如果想立即釋放map占用空間,可以用swap的方式,交換目標map與臨時區域性map的記憶體,這樣離開生存範圍時,臨時map會被釋放掉,如下,

map().swap(maptest);
map在構建的過程中(增刪元素),需要對key值做排序,採用的是比較大小的方式,如果需要定製key比較器,有以下兩種方法,

bool operator < (keytest const& _a) const
例如以字串char*作為key時,

struct ptrstrless

};

執行如下**,

class testdata

;testdata::testdata()

:mtestcode(-1)

testdata::testdata(int testcode)

:mtestcode(testcode)

testdata::testdata(const testdata& other)

:mtestcode(other.mtestcode)

testdata::~testdata()

testdata& testdata::operator=(const testdata& other)

void testfunction()

輸出內容為,

輸出內容如下,

在insert操作前,map已存在key為目標key的元素時:

void testfunction()

輸出內容如下,

在insert操作前,map不存在key為目標key的元素時:

由此可見insert操作時不論事先有沒有已存在key為目標key的元素,都會執行兩次拷貝建構函式;只不過如果事先已存在時,執行了之後沒有改變map的「現狀」,即沒有產生效果。值得指出的是無論是debug模式還是release模式(會有**優化),上述行為都是一致的,因為這是c++語言本身的標準。

上文提到了建構函式、拷貝賦值、析構函式的執行,這裡不妨說明下析構函式的呼叫順序,由於區域性變數儲存在棧上,遵循著先進後出的原則:在離開區域性作用域時,最先定義的區域性變數總是最後被析構。

答案是否,原因如下,

這樣在不同的場景下,會根據map的作用長處和當時的場景判斷是否可以用map,並且可以用的更好(有效且效能較好);

git 基本部分用法記錄

檢視本地分支 git branch 檢視遠端分支 git branch r 檢視全部分支 git branch a git branch 命令例子參考 git fetch 命令例子參考 取回origin主機的master分支。git fetch origin master 取回遠端主機的更新以後,可...

extern的部分用法

extern c 這個就不說了。解決被編譯器認為重複定義的問題,直接看 某個標頭檔案,比如叫 externtest.h 中 externintiextern 這樣就是乙個變數宣告 而不是定義,因為沒有分配儲存空間 這以後就可以引用這個變數,而這個變數的儲存於下面的 int iextern 的那個位置...

PureLayout的部分用法

例如,一排並列兩個按鈕 需要注意的是,先新增的父檢視中,然後才能新增約束有效 1 第乙個按鈕的約束 normalcarrybtn autosetdimensionstosize cgsizemake uiscreenmainscreen bounds.size.width 15 3 2,40 nor...