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...