最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入C++ 函數映射的使用詳解

 更新時間:2013年07月20日 16:08:49   作者:  
我比較喜歡用代碼結合實際來講解,下面我將以一段事例代碼來講解如何使用這幾種映射

想想我們在遇到多語句分支時是不是首先想到的是 switc case 和 if else if ...
這2種方式在編碼方面確實簡單少,但是當分支達到一定數量后,特別是分支內部有嵌套大段代碼或者再嵌套分支,代碼會顯得異常臃腫,十分難以維護,對于if else if 語句過多的分支帶來過多的判定句,勢必會影響效率。

3種替代方法簡述:
1.使用map,需要構建樹和節(jié)點,比數組的方式消耗更多的內存,查詢時間復雜度為Log(N),但擴展起來方便。

2.使用數組,查詢直接索引定位, 一般來講我們是連續(xù)的初始化數組,也就意味索引(type_func)到函數的映射要連續(xù),
所以使用數組索引在擴展上來講:例如增刪元素是稍微麻煩點的。

3. 使用C++的特性---抽象繼承來實現,本文只講前2種的使用,這種方式以后再補充。

復制代碼 代碼如下:

// 動物會一些動作
enum type_func
{
 type_begin = -1,
 type_eat,
 type_sleep,
 type_walk,
 type_run,
 type_smile,
 type_cry,
 type_jump,
 type_max_size,
};
class CAnimal
{
public:
 typedef int (CAnimal::*ptr_func)(bool);
protected:
 static map<type_func,ptr_func> s_map;     
 static ptr_func     s_array[type_max_size];   
public:
 CAnimal()
 {
  memset(s_array,0,sizeof(s_array));
  Init(); 
 }
 // 需要映射函數的返回值 和 參數必須 統一
 int  eat  (bool= true)  { return printf("eatn") ,1; }
 int  sleep (bool= true)  { return printf("sleepn"),1; }
 int  walk (bool= true)  { return printf("walkn") ,1; }
 int  run  (bool= true)  { return printf("runn") ,1; }
 int  smile (bool= true)  { return printf("smilen"),1; }
 int  cry  (bool= true)  { return printf("cryn") ,1; }
 int  jump (bool= true)  { return printf("jumpn") ,1; }
 // 初始化
 void Init ()
 {
  s_map[type_eat]  = &CAnimal::eat;
  s_map[type_sleep] = &CAnimal::sleep;
  s_map[type_walk] = &CAnimal::walk;
  s_map[type_run]  = &CAnimal::run;
  s_map[type_smile] = &CAnimal::smile;
  s_map[type_cry]  = &CAnimal::cry;
  s_map[type_jump] = &CAnimal::jump;
  s_array[type_eat] = &CAnimal::eat;
  s_array[type_sleep] = &CAnimal::sleep;
  s_array[type_walk] = &CAnimal::walk;
  s_array[type_run] = &CAnimal::run;
  s_array[type_smile] = &CAnimal::smile;
  s_array[type_cry] = &CAnimal::cry;
  s_array[type_jump] = &CAnimal::jump;
 }
 // 一般做法是switc case 或者 if else... 
 // 其實這里看起來還不算糟糕,一方面這里我把每個模塊內容都封裝到相應函數了
 // 分支內部才會看起來相對簡潔,實際編碼中可能就不是你現在所看到的方式。
 void Process (type_func type)
 {
  switch (type)
  {
  case type_eat:  eat();  break;
  case type_sleep: sleep(); break;
  case type_walk:  walk();  break;
  case type_run:  run();  break;
  case type_smile: smile(); break;
  case type_cry:  cry();  break;
  case type_jump:  jump();  break;
  }
 }
 // 很熟悉的感覺吧! :)
 void Process2(type_func type)
 {
  if (type_eat == type)
  {
   eat();
  }
  else if (type_sleep == type)
  {
   sleep();
  }
  else if (type_walk == type)
  {
   walk();
  }
  else if (type_run == type)
  {
   run();
  }
  else if (type_smile == type)
  {
   smile();
  }
  else if (type_cry == type)
  {
   cry();
  }
  else if (type_jump == type)
  {
   jump();
  }
 }
 // 使用map 映射
 void ProcessByUseMap(int key, bool val)
 {
  map<type_func,ptr_func>::iterator it =  s_map.find((type_func)key);
  if (it != s_map.end())
  {
   ptr_func pFun = it->second;
   if (pFun) 
    (this->*pFun)(val);
  }
 }
 // 使用數組 映射
 void ProcessByUseArray(int key, bool val)
 {
  // 數組
  if (type_begin < key && type_max_size > key)
  {
   ptr_func pFun = s_array[key];
   if (pFun) 
    (this->*pFun)(val);
  }
 }
 // 使用map 映射
 int operator[] (int key)
 {
  map<type_func,ptr_func>::iterator it =  s_map.find((type_func)key);
  if (it != s_map.end())
  {
   ptr_func pFun = it->second;
   if (pFun)  return (this->*pFun)(false);
  }
  return NULL;
 }
 // 使用數組 映射
 int operator() (int key,bool val)
 {
  if (type_begin < key && type_max_size > key)
  {
   ptr_func pFun = s_array[key];
   if (pFun)  return (this->*pFun)(val);
  }
  return NULL;
 }
};
map<type_func, CAnimal::ptr_func> CAnimal::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);
map<type_func,ptrFun> g_map;
ptrFun     g_array[type_max_size];
int _tmain(int argc, _TCHAR* argv[])
{
 //////////////////////////////////////////////////////////////////////////
 // 為了便于說明,下面代碼不做安全檢查
 // 非成員函數映射2種用法
 // init
 g_map[type_eat] = func_eat;
 g_map[type_run] = func_run;
 g_map[type_walk] = func_walk;
 g_map[type_cry] = func_cry;
 g_array[type_eat] = func_eat;
 g_array[type_run] = func_run;
 g_array[type_walk] = func_walk;
 g_array[type_cry] = func_cry;
 // using
 g_map[type_eat](1);
 g_map[type_run](2);
 g_map[type_walk](3);
 g_map[type_cry](4);
 g_array[type_eat](1);
 g_array[type_run](2);
 g_array[type_walk](3);
 g_array[type_cry](4);
 //////////////////////////////////////////////////////////////////////////
 // 成員函數映射使用
 CAnimal Dog;
 Dog.Process(type_eat);
 Dog.ProcessByUseMap(type_run,true);
 Dog.ProcessByUseArray(type_cry,false);
 Dog[type_walk];
 Dog(type_sleep,true);
 Dog(type_run,false);
 return 1;
}

相關文章

  • C++第三方日志庫Glog基本語法詳解

    C++第三方日志庫Glog基本語法詳解

    這篇文章主要介紹了C++第三方日志庫Glog基本語法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • 實例講解C++設計模式編程中State狀態(tài)模式的運用場景

    實例講解C++設計模式編程中State狀態(tài)模式的運用場景

    這篇文章主要介紹了實例講解C++設計模式編程中State狀態(tài)模式的運用場景,文章最后的適用性部分則介紹了一些State模式善于處理的情況,需要的朋友可以參考下
    2016-03-03
  • C語言實現靜態(tài)鏈表的方法

    C語言實現靜態(tài)鏈表的方法

    分享一段代碼,一個靜態(tài)鏈表的C語言實現,其中包含著一種簡單的內存管理策略:固定大小的鏈式管理。
    2013-03-03
  • C語言中關于庫函數 qsort 的模擬實現過程

    C語言中關于庫函數 qsort 的模擬實現過程

    庫函數的模擬實現有利于我們去深入了解這個函數內部是怎樣實現的,以及學習它的算法,使我們更加了解這個函數該怎樣去使用,接下來我將詳細的介紹qsort的應用及用法,并且用代碼模擬實現它們的功能
    2021-09-09
  • C語言實現的排列組合問題的通用算法、解決方法

    C語言實現的排列組合問題的通用算法、解決方法

    這篇文章主要介紹了C語言實現的排列組合問題的通用算法、解決方法,本文使用C語言實現在程序中解決這個問題,需要的朋友可以參考下
    2014-08-08
  • C++如何將二叉搜索樹轉換成雙向循環(huán)鏈表(雙指針或數組)

    C++如何將二叉搜索樹轉換成雙向循環(huán)鏈表(雙指針或數組)

    這篇文章主要介紹了C++如何將二叉搜索樹轉換成雙向循環(huán)鏈表(雙指針或數組),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 一文詳解C語言char類型中的存儲

    一文詳解C語言char類型中的存儲

    C語言中的char是用于聲明單個字符的關鍵字,這篇文章主要給大家介紹了關于C語言char類型中存儲的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • C++數據結構的隊列詳解

    C++數據結構的隊列詳解

    這篇文章主要為大家介紹了C++數據結構的隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++實現聊天小程序

    C++實現聊天小程序

    這篇文章主要為大家詳細介紹了C++實現聊天小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++??STL?_?Vector使用及模擬實現

    C++??STL?_?Vector使用及模擬實現

    這篇文章主要介紹了C++ STL_Vector使用及模擬實現,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08

最新評論

永兴县| 石楼县| 上饶市| 高淳县| 黄骅市| 普洱| 阿合奇县| 寿宁县| 松原市| 景谷| 盐亭县| 临沂市| 崇左市| 诸暨市| 沅陵县| 安康市| 铁岭县| 怀柔区| 宝兴县| 新安县| 广州市| 曲沃县| 大洼县| 神木县| 大足县| 鄄城县| 黑山县| 双辽市| 嘉定区| 二连浩特市| 海城市| 上林县| 扶风县| 祁门县| 东源县| 鸡泽县| 梨树县| 敖汉旗| 嫩江县| 海林市| 铜山县|