記初入c 模板元

2021-09-24 21:27:03 字數 2305 閱讀 9768

乙個問題:列印250(包括250)以內的所有素數;

第一種方法:自己找出所有的素數,並放入乙個陣列中,可能的一種**如下:

#include int main()

;//需要自己找,自己算,猝死.......

//列印

for(int i = 0; i < sizeof(primes); ++i)

std::cout << "第" + << i + 1 << "個素數是: " << primes[i] << std::endl;

return 0;

}

第二種方法:讓程式幫我們找,我們可以寫乙個判斷是不是素數的函式,然後再寫乙個迴圈,一種可能的**如下

#include bool isprime(int i)

#define n 250

int main()

}return 0;

}

現在我們看一下這兩種方法,第一種應該沒有人願意那樣寫吧,所以直接看第二種;

第二種方法中,程式執行之後,會幫我們乙個乙個的判斷哪些是素數,如果當前這個數是素數,那就列印出來;

第二種方法是沒有任何問題的,但250以內的素數有幾個,是哪些,不管如何這些一定是確定下來的,只是我們懶得計算,將這個任務交給了程式,讓程式幫我們計算,這樣勢必會讓程式做一些不必要的計算,我們希望乙個程式只計算它必須要計算的;

那麼有沒有乙個折中的方法,我們可以多敲一些**,但同時又不需要我們自己找、自己算;答案肯定是有,那就是模板元

模板元說到底就是讓編譯器幫我們算好,然後程式就可以直接使用(本來我們可以自己算出來的,就像第一種方法一樣)

首先來乙個最簡單最常見的:模板元計算n!(n的階乘)

一種可能的**如下:

#include template struct fac;};

template <>

struct fac<1>;};

int main()

在上面的程式中,編譯器會幫我們計算出10!,當然如果我們要自己算的話,你需要準備一根筆,一本草稿本,然後按照階乘的定義一步一步算;

然後回到正文,怎麼找250以內的所有素數呢?

廢話不多說,直接上原始碼;

#include #include //模板元選擇結構

template struct if

;template struct if;

//template struct bool

;//輔助isprime計算

template struct prime

;//輔助isprime計算, 一直算到2終止計算

template struct prime;

//判斷數n是否為乙個素數,如果n是素數則value = true,否則為false

template struct isprime

;//2是素數,但2無法通過prime來計算判斷,所以使用特例化

template <>

struct isprime<2>

;//尋找 <= n 的所有素數,並存放進m_vec中

template struct vecprime

static inline void init(std::vector&vec)

std::vectorm_vec;

};//數字1比較特殊,特別對待,使用模板特例化

template <>

struct vecprime<1>

std::vectorm_vec;

};#define n 250

int main()

; for(int i = 0; i < vecprime.m_vec.size(); ++i)

std::cout << "第" << i + 1 << "個素數是: " << vecprime.m_vec[i] << std::endl;

return 0;

}

至此,就算是成功使用模板元找到250(包括250)以內的所有素數;

巧妙的使用模板元,可以將很多計算轉移到編譯期,從而提公升程式的執行速度,但缺點也很明顯,需要多碼很多**,而且**不怎麼好閱讀,一旦編譯報錯,很容易讓人懵逼,不知道從哪找錯

當然,這僅僅是入門,不好做過多的評價;

初入元學習(一)

何為 元學習 元學習,就是讓機器學會如何學習!何為神經網路?神經網路就是模仿人類神經一層一層處理資訊,把輸入資料經過一層一層對映,最後得到結果。那麼人類如何學習呢?分類 回歸這些明顯是下游任務,上游任務是學習如何學習。這個就很泛化了,每個人的學習方式不同,那麼如何才能抽象出學習方式?那麼,我們來回顧...

C 模板初了解

泛型程式設計顧名思義 可以通泛的使用,比如我們要使用乙個add加法函式,void add int a,int b void add double a,double b void add float a,float b 那我們可以通過函式過載來實現,但是函式過載有不好的地方,那就是 1 過載的函式只是...

C語言 指標初入(一)!

2.指標變數的定義 3.指標變數的賦值 4.開闢動態儲存單元 5.指標運算子 指標嘛?這玩意,還真挺難!每次程式設計序遇到指標時 指標,是c語言的一種派生型別,指標變數儲存的值是某 記憶體位址 使用指標可以更加靈活地組織具有複雜關係的資料,簡化操作過程,提高程式的執行效率。可以通過其儲存位址間接訪問...