想想我們在遇到多語句分支時是不是首先想到的是 switc case 和 if else if ...
這2種方式在編碼方面確實簡單少,但是當分支達到一定數量後,特別是分支內部有巢狀大段**或者再巢狀分支,
**會顯得異常臃腫,十分難以維護,對於if else if 語句過多的分支帶來過多的判定句,勢必會影響效率。
3種替代方法簡述:
1.使用map,需要構建樹和節點,比陣列的方式消耗更多的記憶體,查詢時間複雜度為log(n),但擴充套件起來方便。
2.使用陣列,查詢直接索引定位, 一般來講我們是連續的初始化陣列,也就意味索引(type_func)到函式的對映要連續,
所以使用陣列索引在擴充套件上來講:例如增刪元素是稍微麻煩點的。
3.使用c++的特性---抽象繼承來實現,本文只講前2種的使用,這種方式以後再補充。
我比較喜歡用**結合實際來講解,下面我將以一段事例**來講解如何使用這幾種對映:
// 動物會一些動作
enum type_func
;class canimal
// 需要對映函式的返回值 和 引數必須 統一
int eat (bool= true)
int sleep (bool= true)
int walk (bool= true)
int run (bool= true)
int smile (bool= true)
int cry (bool= true)
int jump (bool= true)
// 初始化
void init ()
// 一般做法是switc case 或者 if else...
// 其實這裡看起來還不算糟糕,一方面這裡我把每個模組內容都封裝到相應函式了
// 分支內部才會看起來相對簡潔,實際編碼中可能就不是你現在所看到的方式。
void process (type_func type) }
// 很熟悉的感覺吧! :)
void process2(type_func type)
else if (type_sleep == type)
else if (type_walk == type)
else if (type_run == type)
else if (type_smile == type)
else if (type_cry == type)
else if (type_jump == type)
}// 使用map 對映
void processbyusemap(int key, bool val) }
// 使用陣列 對映
void processbyusearray(int key, bool val) }
// 使用map 對映
int operator (int key)
return null;
} // 使用陣列 對映
int operator() (int key,bool val)
return null;
}};mapcanimal::s_map;
canimal::ptr_func canimal::s_array[type_max_size];
//// 非成員函式
void func_eat(int = 0)
void func_run(int = 0)
void func_walk(int =0)
void func_cry(int = 0)
typedef void (*ptrfun)(int);
mapg_map;
ptrfun g_array[type_max_size];
int _tmain(int argc, _tchar* argv)
Elasticsearch對映使用講解
索引中每個文件都有乙個型別 type 每個型別擁有自己的對映 mapping 或者模式定義 schema definition 乙個對映定義了字段型別,每個欄位的資料型別,以及欄位被elasticsearch處理的方式。對映還用於設定關聯到型別上的元資料。核心簡單字段型別 elasticsearch...
對映型別講解
1 對映型別中的字典 python中通過名稱訪問各個值的資料結構稱為對映 字典是python唯一的內建對映型別 key value 其中key可以是數字 字串或元組。1.1 字典的定義 建立字典 data 使用dict建立字典 xval xname john xage 38 xdata dict x...
C 建構函式講解
建構函式的種類 如果建立乙個類沒寫建構函式,則系統會自動生成乙個預設建構函式,該建構函式沒有引數,函式為空,什麼都不做。只要寫了如下某乙個建構函式,則系統不會生成預設建構函式 1.無參建構函式 a 2.一般建構函式 a int v1,int v2 3.複製建構函式 a const a a 若沒有顯式...