導航:首頁 > 使用方法 > c模板類的使用方法

c模板類的使用方法

發布時間:2022-12-29 00:15:40

1. c++中如何使用類模板

template<typename T>//方法模板
T add(T const&a,const T&b){//兩個const限定等價
return a+b;
}//注意,這里沒有分號,因為這是方法

template<typename T>//結構體模板
struct S{
T s;
};//注意,這里有分號,因為這是結構體

template<typename T>//類模板
class A{
public:
S<T> s;//使用了結構體模板
void set(T s0);
};//注意,這里有分號,因為這是類

template<typename T>//實現類裡面的方法
void A<T>::set(T s0){//注意這一行的格式
s.s=s0;
}
//注意,這個方法只有到被使用時才會開始實例化,不過可以顯式實例化讓它一開始就實例化

int main(){
template A<int>;//顯式實例化
template A<double>;
int a=1,b=2;
double c=3.3;
add(a,b);//正確
add(a,c);//錯誤,模板參數類型是嚴格匹配的,不可能進行隱式轉換
A<int> a;//使用了類模板
a.set(5);
cout<<a.s.s;//輸出5
}

以上為類型參數模板
下面為值參數模板
template<unsigned int N>
class bitset;
。。。
bitset<100> b1;

模板定做,即針對某一類型的參數特別處理,比如加法並不是對所有的類型都適用,對於char*類型就要定做下
//先定義模板
template<typename T>
class A{
public:
T s;
void show();
}
template<typename T>
void A<T>::show(){
cout<<s<<endl;
}
//然後模板定做
class B{}//定義一個類型
template<>//不要填入類型
class A<B>{//直接使用自己需要的類型
public:
B s;//相應改為自己需要的類型
void show();
}
void A<B>::show(){//注意格式,這里沒有template語句
cout<<s<<endl;
}

模板參數可以有多個
template<typename T1,typename T2>
class A{}

只定做T2而不定做T1就叫局部定做,如:
template<typename T1>
class A<T1,T1>{}

template<typename T1>
class A<T1,B>{}

2. C++中vector+模板的使用方法

(1)vector< 類型 > 標識符 ;
(2)vector< 類型 > 標識符(最大容量) ;
(3)vector< 類型 > 標識符(最大容量,初始所有值);
(4) int i[4] = {12,3,4,5};
vector< 類型 > vi(i , i+2); //得到i索引值為3以後的值 ;

(5)vector< vector<int> > //vi 定義2維的容器;記得一定要有空格,不然會報錯
vector< int > line
// 在使用的時候一定要首先將vi個行進行初始化;
for(int i = 0 ; i < 10 ; i ++)
{
vector.push_back(line);
}
/// 個人認為使用vector定義二維數組很好,
因為是長度可以不預先確定。很好。
(6)C++ Vector排序
vector< int > vi ; vi.push_back(1); vi.push_back(3); vi.push_back(0); sort(vi.begin() , vi.end()); /// /小到大 reverse(vi.begin(),vi.end()) /// 從大道小

(7)順序訪問
vector < int > vi ; for( int i = 0 ; i < 10 ; i ++) { vector.push_back(i); } for(int i = 0 ; i < 10 ; i ++) /// 第一種調用方法 { cout <<vector[i] <<" " ; } for(vector<int>::iterator it = vi.begin() ; it !=vi.end() ; it++) ///第二種調用方法 { cout << *it << " " ; }

(8)尋找
vector < int > vi ; for( int i = 0 ; i < 10 ; i ++) { vector.push_back(i); } vector < int >::interator it = find(vi.begin() , vi.end,3) ; cout << *it << endl ; ///返回容器內找到值的位置。

(9)使用數組對C++ Vector進行初始化
int i[10] ={1,2,3,4,5,6,7,78,8} ; ///第一種 vector<int> vi(i+1,i+3); ///從第2個元素到第三個元素 for(vector <int>::interator it = vi.begin() ; it != vi.end() ; it++) { cout << *it <<" " ; }

(10) 結構體類型
struct temp { public : string str ; public : int id ; }tmp int main() { vector <temp> t ; temp w1 ; w1.str = "Hellowor" ; w1.id = 1 ; t.push_back(t1); cout << w1.str << "," <<w1.id <<endl ; return 0 ; }
vector類為內置數組提供了一種替代表示,與string類一樣 vector 類是隨標准
C++引入的標准庫的一部分 ,為了使用vector 必須包含相關的頭文件 。

3. C++中函數模板怎麼

1.函數模板的聲明和模板函數的生成

1.1函數模板的聲明
函數模板可以用來創建一個通用的函數,以支持多種不同的形參,避免重載函數的函數體重復設計。它的最大特點是把函數使用的數據類型作為參數。
函數模板的聲明形式為:
template<typename 數據類型參數標識符>
<返回類型><函數名>(參數表)
{
函數體
}
其中,template是定義模板函數的關鍵字;template後面的尖括弧不能省略;typename(或class)是聲明數據類型參數標識符的關鍵字,用以說明它後面的標識符是數據類型標識符。這樣,在以後定義的這個函數中,凡希望根據實參數據類型來確定數據類型的變數,都可以用數據類型參數標識符來說明,從而使這個變數可以適應不同的數據類型。例如:
template<typename T>
T fuc(T x, int y)
{
T x;
//……
}
如果主調函數中有以下語句:
double d;
int a;
fuc(d,a);
則系統將用實參d的數據類型double去代替函數模板中的T生成函數:
double fuc(double x,int y)
{
double x;
//……
}
函數模板只是聲明了一個函數的描述即模板,不是一個可以直接執行的函數,只有根據實際情況用實參的數據類型代替類型參數標識符之後,才能產生真正的函數。
關鍵字typename也可以使用關鍵字class,這時數據類型參數標識符就可以使用所有的C++數據類型。
1.2.模板函數的生成
函數模板的數據類型參數標識符實際上是一個類型形參,在使用函數模板時,要將這個形參實例化為確定的數據類型。將類型形參實例化的參數稱為模板實參,用模板實參實例化的函數稱為模板函數。模板函數的生成就是將函數模板的類型形參實例化的過程。例如:
使用中應注意的幾個問題:
⑴ 函數模板允許使用多個類型參數,但在template定義部分的每個形參前必須有關鍵字typename或class,即:
template<class 數據類型參數標識符1,…,class 數據類型參數標識符n>
<返回類型><函數名>(參數表)
{
函數體
}
⑵ 在template語句與函數模板定義語句<返回類型>之間不允許有別的語句。如下面的聲明是錯誤的:
template<class T>
int I;
T min(T x,T y)
{
函數體
}
⑶ 模板函數類似於重載函數,但兩者有很大區別:函數重載時,每個函數體內可以執行不同的動作,但同一個函數模板實例化後的模板函數都必須執行相同的動作。

2 函數模板的異常處理

函數模板中的模板形參可實例化為各種類型,但當實例化模板形參的各模板實參之間不完全一致時,就可能發生錯誤,如:
template<typename T>
void min(T &x, T &y)
{ return (x<y)?x:y; }
void func(int i, char j)
{
min(i, i);
min(j, j);
min(i, j);
min(j, i);
}
例子中的後兩個調用是錯誤的,出現錯誤的原因是,在調用時,編譯器按最先遇到的實參的類型隱含地生成一個模板函數,並用它對所有模板函數進行一致性檢查,例如對語句
min(i, j);
先遇到的實參i是整型的,編譯器就將模板形參解釋為整型,此後出現的模板實參j不能解釋為整型而產生錯誤,此時沒有隱含的類型轉換功能。解決此種異常的方法有兩種:
⑴採用強制類型轉換,如將語句min(i, j);改寫為min(i,int( j));
⑵用非模板函數重載函數模板
方法有兩種:
① 借用函數模板的函數體
此時只聲明非模板函數的原型,它的函數體借用函數模板的函數體。如改寫上面的例子如下:
template<typename T>
void min(T &x, T &y)
{ return (x<y)?x:y; }
int min(int,int);
void func(int i, char j)
{
min(i, i);
min(j, j);
min(i, j);
min(j, i);
}
執行該程序就不會出錯了,因為重載函數支持數據間的隱式類型轉換。
② 重新定義函數體
就像一般的重載函數一樣,重新定義一個完整的非模板函數,它所帶的參數可以隨意。C++中,函數模板與同名的非模板函數重載時,應遵循下列調用原則:
• 尋找一個參數完全匹配的函數,若找到就調用它。若參數完全匹配的函數多於一個,則這個調用是一個錯誤的調用。
• 尋找一個函數模板,若找到就將其實例化生成一個匹配的模板函數並調用它。
• 若上面兩條都失敗,則使用函數重載的方法,通過類型轉換產生參數匹配,若找到就調用它。
•若上面三條都失敗,還沒有找都匹配的函數,則這個調用是一個錯誤的調用。

閱讀全文

與c模板類的使用方法相關的資料

熱點內容
中式棉襖製作方法圖片 瀏覽:62
五菱p1171故障碼解決方法 瀏覽:857
男士修護膏使用方法 瀏覽:545
電腦圖標修改方法 瀏覽:606
濕氣怎麼用科學的方法解釋 瀏覽:536
910除以26的簡便計算方法 瀏覽:804
吹東契奇最簡單的方法 瀏覽:703
對腎臟有好處的食用方法 瀏覽:97
電腦四線程內存設置方法 瀏覽:511
數字電路通常用哪三種方法分析 瀏覽:12
實訓課程的教學方法是什麼 瀏覽:524
苯甲醇乙醚鑒別方法 瀏覽:81
蘋果手機微信視頻聲音小解決方法 瀏覽:699
控制箱的連接方法 瀏覽:74
用什麼簡單的方法可以去痘 瀏覽:788
快速去除甲醛的小方法你知道幾個 瀏覽:802
自行車架尺寸測量方法 瀏覽:123
石磨子的製作方法視頻 瀏覽:151
行善修心的正確方法 瀏覽:402
土豆燉雞湯的正確方法和步驟 瀏覽:275