現在,換一種方式來看hanoi塔問題。這次用模板。來看這段**:
#include
using
namespace std;
template
<
int n,
int a,
int b,
int c>
class
tower};
template
<
int a,
int b,
int c>
class
tower
<
1,a,b,c>};
intmain()
**是超級簡單的。大於一層的hanoi塔含有兩個子hanoi塔問題,它們的型別分別是tower和tower。移動盤子的操作是在建構函式裡完成的。所以,定義乙個hanoi變數就好了,什麼都不用做。
這段**編譯時會給編譯器帶來什麼樣的開銷呢?因為每個tower例項,都用到了兩個n-1層的子型別,咋一看一共生成2的n次方-1個型別。然而,根據完全2-叉樹的推算公式每一層有2的i次方個節點。而每一層,按a,b,c的全排列,最多只能生成6個型別,所以沒那麼多。數學推導就不做了,仍然利用這個**自動計算數一下。
#include
using
namespace std;
#define max 10
int count[max][6
];enum
;#define test_val(a,b,c) (a<<8|b<<4|c)
intadd
(int n,
int a,
int b,
int c)
return1;
}template
<
int n,
int a,
int b,
int c>
class
tower};
template
<
int a,
int b,
int c>
class
tower
<
1,a,b,c>};
intmain()
else cout <<
".";
} cout <<
"\n";}
}
這裡count陣列意外的和std命名空間的某個東西衝突了。只好在函式體裡再用extern說明一下。看來using namespace std;這句話有點大了…
這是執行結果:
move plate ...
move ...
1:. x x .
. x
2: x .
. x x .3:
. x x .
. x
4: x .
. x x .5:
. x x .
. x
6: x .
. x x .7:
. x x .
. x
8: x .
. x x .9:
. x x ...
10: x ...
..
可見除了最後兩層,每層都生成3個型別。總共是 3 *(n-2) +3 = 3 *n -3
編譯器總共例項化生成 3 *n -3個tower型別。
C 模板的編譯問題
c 編譯器與鏈結器工作原理 講了一下 c 對於模板,包括模板類與模板函式,它們的 其實並不是直接翻譯成二進位制 它要求有乙個 具體化 的過程,舉個例子 template void funa t t int main 也就是說,如果在 main 函式中,沒有呼叫過 funa 函式的話,那麼在 main...
C 模板的編譯問題
對於模板,包括模板類與模板函式,它們的 其實並不是直接翻譯成二進位制 它要求有乙個 具體化 的過程,舉個例子 template void funa t t int main 也就是說,如果在main函式中,沒有呼叫過funa函式的話,那麼在main.obj中就找不到關於funa的任意二進位制 如果呼...
C 模板的編譯問題
對於模板,包括模板類與模板函式,它們的 其實並不是直接翻譯成二進位制 它要求有乙個 具體化 的過程,舉個例子 template void funa t t int main 也就是說,如果在main函式中,沒有呼叫過funa函式的話,那麼在main.obj中就找不到關於funa的任意二進位制 如果呼...