亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-01-26 15:59:00
字體:
來源:轉載
供稿:網友

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

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

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

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;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美黑人性生活视频| 欧美激情亚洲视频| 在线电影欧美日韩一区二区私密| 亚洲伊人一本大道中文字幕| 中文字幕精品久久| 亚洲精品二三区| 久久视频国产精品免费视频在线| 爽爽爽爽爽爽爽成人免费观看| 57pao成人永久免费视频| 在线成人免费网站| 2019亚洲日韩新视频| 亚洲国产小视频| 精品一区二区三区三区| 欧美激情va永久在线播放| 91九色在线视频| 成人午夜激情免费视频| 欧美精品videos性欧美| 在线精品高清中文字幕| 国产精品精品国产| 久久精品这里热有精品| 欧美成人在线免费视频| 国产精品极品美女粉嫩高清在线| 日韩黄在线观看| 97在线看免费观看视频在线观看| 久久久国产精品一区| 日日噜噜噜夜夜爽亚洲精品| 国产成人精品视频在线| 欧美日韩国产在线播放| 欧美极品少妇全裸体| 蜜臀久久99精品久久久久久宅男| 欧美成人精品在线播放| 久久人91精品久久久久久不卡| 欧美极品美女视频网站在线观看免费| 在线免费观看羞羞视频一区二区| 国产一区二区三区在线看| 日韩va亚洲va欧洲va国产| 欧美大胆a视频| 欧美激情一二三| 97精品国产97久久久久久春色| 欧美一级免费视频| 亚洲色图18p| 成人久久18免费网站图片| 日本高清+成人网在线观看| 亚洲一区二区国产| 91视频九色网站| 日韩成人免费视频| 在线精品高清中文字幕| 亚洲性线免费观看视频成熟| 欧美插天视频在线播放| 国产大片精品免费永久看nba| 欧美成人精品三级在线观看| 欧美老妇交乱视频| 国产精品第一页在线| 欧美成人剧情片在线观看| 亚洲精品国产福利| 欧美国产视频一区二区| 亚洲欧洲在线播放| 成人激情av在线| 97精品一区二区三区| 一区二区三区高清国产| 国产成人在线亚洲欧美| 国产精品第三页| 欧美福利在线观看| 久久五月天综合| 日韩亚洲综合在线| 国产精品免费一区豆花| 91精品久久久久久| 日韩精品黄色网| 欧美日韩一区二区三区在线免费观看| 国产欧美在线播放| 国产精品中文字幕久久久| 亚洲一区二区自拍| 操91在线视频| 亚洲国产婷婷香蕉久久久久久| 清纯唯美日韩制服另类| 久久成人人人人精品欧| 久久精视频免费在线久久完整在线看| 国产精品久久久久久亚洲影视| 国产精品自拍网| 日韩欧美国产免费播放| 久久久久国产精品www| 欧美日韩在线影院| 国产剧情久久久久久| 日韩精品久久久久| 日韩av免费看| 成人免费视频xnxx.com| 精品久久国产精品| 亚洲新中文字幕| 国产精品成人久久久久| 精品无人区太爽高潮在线播放| 欧美日韩国产二区| 国产成人一区三区| 色综合久久久888| 日韩一区二区久久久| 91精品国产高清| 国产精品视频免费在线| 亚洲伊人一本大道中文字幕| 国产精品一区二区三区免费视频| 2019精品视频| 久久久亚洲天堂| 成人激情免费在线| 久久精品国产成人| 国产精品视频xxx| 日韩欧美精品网站| 日日骚av一区| 亚洲综合在线做性| 日韩av免费在线看| 国产精品88a∨| 国产日韩精品综合网站| 日韩电视剧免费观看网站| 亚洲一级黄色av| 欧美午夜性色大片在线观看| 国产亚洲在线播放| 国产69精品久久久久9999| 亚州成人av在线| 粉嫩av一区二区三区免费野| 98精品国产高清在线xxxx天堂| 欧美人交a欧美精品| 精品露脸国产偷人在视频| 8090成年在线看片午夜| 色香阁99久久精品久久久| 国产精品白丝av嫩草影院| 国产一区二区三区免费视频| 亚洲女人被黑人巨大进入al| 亚洲女人天堂成人av在线| 欧美视频在线观看 亚洲欧| 日韩av免费在线| 亚洲第一区中文字幕| 国产亚洲人成网站在线观看| 欧美在线影院在线视频| 国产剧情日韩欧美| 午夜精品久久久久久99热| 麻豆一区二区在线观看| 国产一区二区三区三区在线观看| 欧美精品亚州精品| 成人午夜高潮视频| 国产欧美精品一区二区| 992tv在线成人免费观看| 久久91亚洲精品中文字幕| 国产suv精品一区二区| 91国产高清在线| 欧洲亚洲免费在线| 国产一区二区激情| 中文字幕久久久av一区| 亚洲男女自偷自拍图片另类| 色视频www在线播放国产成人| 欧美成人性色生活仑片| 日韩精品视频在线播放| 亚洲tv在线观看| 久久精品人人爽| 日韩av片电影专区| 亚洲第一精品久久忘忧草社区| 51精品国产黑色丝袜高跟鞋| 中文字幕日韩欧美精品在线观看| 国产精品美女网站| 国产精品精品视频一区二区三区| 91精品国产91久久久久久| 欧美日韩亚洲一区二区| 中文字幕日韩免费视频| 亚洲第一在线视频| 久久人人97超碰精品888| 国产精品日韩在线| 91豆花精品一区| 日韩av综合中文字幕|