1. 程式人生 > >C++ primer 模板與泛型程式設計

C++ primer 模板與泛型程式設計

繼續瀏覽c++ primer 看到模板與泛型程式設計這章,就順便把這幾節的程式碼綜合了下,對一個Queue佇列模板的實現

貼一下程式碼(看完書,自己敲,忘記了哪再看下書)

#include <ostream>
using std::ostream;

//宣告Queue的模板類
template <class Type> class Queue;
//宣告模板函式
template <class T> ostream& operator<<(ostream& , const Queue<T>&);


//定義QueueItem的模板類
template <class Type> class QueueItem
{
	//定義友元模板類和友元模板函式
	friend class Queue<Type>;
	friend ostream& operator<< <Type>(ostream& , const Queue<Type>&);
	//QueueItem建構函式
	QueueItem(const Type &t):item(t),next(0){}
	QueueItem *next;
	Type item;
};

//定義Queue模板類
template <class Type> class Queue
{
	//定義友元模板函式
	friend ostream& operator<< <Type>(ostream& , const Queue<Type>&);
public:
	//建構函式
	Queue():head(0),tail(0){}
	template <class It> Queue(It beg, It end):head(0),tail(0){copy_elems(beg,end);}
	template <class Iter> void assign(Iter , Iter);
	//複製建構函式
	Queue(const Queue &object){head(0);tail(0);copy_elems(object);}
	//賦值操作符
	Queue& operator=(const Queue&);
	//解構函式
	~Queue(){destroy();}
	//push操作
	void push(const Type&);
	//pop操作
	void pop();
	//取佇列頭元素的操作front
	Type& front();
	//判斷是否為空的操作
	bool empty(){return head==0;}
private:
	QueueItem *head;
	QueueItem *tail;
	void destroy();
	void copy_elems(const Queue&);
	template <class Iter> void copy_elems(Iter , Iter);
};
//過載輸出操作符
template <class T> ostream& operator<<(ostream &os , const Queue<T> &object)
{
	os << "<";
	QueueItem *p;
	for(p=object.head;p!=object.tail;p=p->next)
	{
		os <<p->item << " ";
	}
	os << ">" << endl;
}
//定義Queue模板類中的模板成員函式
template<class Type> template <class Iter> void Queue<Type>::assign(Iter beg, Iter end)
{
	destroy();
	copy_elems(beg , end);
}
//定義Queue模板類中的copy_elems模板成員函式
template <class Type> template <class Iter> void Queue<Type>::copy_elems(Iter beg, Iter end)
{
	while(beg != end)
	{
		push(*beg);
		++beg;
	}
}
//Queue模板類中的copy_elems成員函式
template <class Type> void Queue<Type>::copy_elems(const Queue &object)
{
	QueueItem<Type> *p;
	for(p=object.head;p&&p!=object.tail;p=p->next)
	{
		push(p->item);
	}
}
//賦值操作符
template <class Type> Queue<Type>& Queue<Type>::operator=(const Queue &rhs)
{
	if(&rhs != this)
	{
		destroy();
		copy_elems(rhs);
	}
	return *this;
}
/*
//另外一種用連結串列直接實現賦值操作符
template <class Type> Queue<Type>& Queue<Type>::operator=(const Queue &rhs)
{
	QueueItem<Type> *p = rhs.head;
	while(p)
	{
		QueueItem<Type> *q = new QueueItem<Type>(p->item);
		if(p == rhs.head)
		{
			head = tail = q;
		}else{
			tail->next = q;
			tail = q;
			p=p->next;
		}
	}
	return *this;
}
*/
//push操作
template <class Type> void Queue<Type>::push(const Type &value)
{
	QueueItem<Type> *p = new QueueItem<Type>(value);
	if(this->empty())
	{
		head = p;
		tail = p;
	}else{
		tail->next = p;
		tail = p;
	}
}
//pop操作
template <class Type> void Queue<Type>::pop()
{
	QueueItem<Type> *p;
	p=head;
	head = head->next;
	delete p;
}
//front操作
template <class Type> Type& Queue<Type>::front()
{
	return head->item;
}
//destory操作
template <class Type> void Queue<Type>::destroy()
{
	while(!empty())
	{
		pop();
	}
}


相關推薦

C++ primer 模板程式設計

繼續瀏覽c++ primer 看到模板與泛型程式設計這章,就順便把這幾節的程式碼綜合了下,對一個Queue佇列模板的實現 貼一下程式碼(看完書,自己敲,忘記了哪再看下書) #include <ostream> using std::ostream; //宣告Q

effective C++筆記--模板程式設計(三)

文章目錄 請使用traits classes表現型別資訊 認識模板超程式設計 請使用traits classes表現型別資訊 . traits並不是C++的關鍵字或是預先定義好的構件,它們是一種技術,也是一個C++程式設計師共同遵守的協議

effective C++筆記--模板程式設計(二)

文章目錄 運用成員函式模板接受所有相容型別 需要型別轉換時請為模板定義非成員函式 運用成員函式模板接受所有相容型別 . 真實指標做的很好的一件事是支援隱式轉換,派生類的指標可以指向基類的指標,指向非常量物件的指標可以指向轉換成常量物件的指

effective C++筆記--模板程式設計(一)

文章目錄 瞭解隱式介面和編譯器多型 瞭解typename的雙重意義 學習處理模板化基類內的名稱 將與引數無關的程式碼抽離template 瞭解隱式介面和編譯器多型 . 面向物件程式設計世界總是以顯式介面和執行期多型解決問題。比

C/C++基礎--模板程式設計

模板引數 函式模板,編譯器根據實參來為我們推斷模板實參。 模板中可以定義非型別引數,表示一個值而非一個型別,這些值必須是常量表達式,從而允許編譯器在編譯時例項化模板。 非型別引數可以是整型,或者一個指向物件或函式的指標或(左值)引用。繫結到前者的實參必須是常量表達式,繫結到後者的必須具有靜態生存期

《Effective C++》模板程式設計:條款32-條款40

條款41:瞭解隱式介面和編譯期多型 class支援顯示介面和執行期多型 class的顯示介面由函式的名籤式構成(函式名稱、引數型別、返回型別) class的多型通過virtual函式發生在執行期 template支援隱式介面和編譯期多型 templa

12.29--C++模板程式設計--《C++ Primer》學習

今天學習第16章《模板與泛型程式設計》 感覺腦子有點模模糊糊的,效率不是很高,趕快寫一下學習日誌備忘。 模板其實在java中用的也多了,但是C++的沒用過,感覺有點虛。 其實的確是差不多的用法,所以記幾個點好了。 1. 模板形參表,即template <typename

C++primer(第五版)》學習之路-第十六章:模板程式設計

【宣告:版權所有,轉載請標明出處,請勿用於商業用途。聯絡信箱:[email protected]】 16.1 定義模板 1.模板定義以關鍵字template開始,後跟一個模板引數列表,這是一個逗號分隔的一個或多個模板引數的列表,用小於號(<)和大於號(&

模板程式設計(二)--《C++ primer

 通常在呼叫普通函式時,我們只要做到將函式的宣告放到其定義的前面,保證編譯器先掌握到函式的宣告,因此我們會把其函式宣告放到標頭檔案,而其定義放到原始檔當中;但是模板不同,為了生成一個例項化版本,編譯器需要掌握函式模板或類模板成員函式的定義,所以模板標頭檔案通常既包括宣告

C++面試總結(三)模板程式設計

1.什麼是模板?    泛型程式設計是指獨立與任何型別的方式編寫程式碼。泛型程式設計和麵向物件程式設計,都依賴與某種形式的多型。面向物件程式設計的多型性在執行時應用於存在繼承關係的類,一段程式碼可以可以忽略基類和派生類之間的差異。在泛型程式設計中,編寫的程式碼可以用作多種型別

如何寫出高效C++(模板程式設計)

對Effective C++讀了以後的總結(暑假沒事幹。。就是看書,從後往前的總結) 41。瞭解隱式介面和編譯器多型 隱式介面:由一組有效表示式構成,表示式要求了相應的約束條件。 顯式介面:則是在原始碼中明確可見的指出介面的約束條件(比如函式引數的型別)。 所謂的編譯期多

C++11(15): 模板程式設計

面向物件程式設計和泛型程式設計都能處理在編寫程式時不知道型別的情況。不同之處:OOP能處理型別在程式執行之前都未知的情況;而泛型程式設計中,在編譯時就能獲知型別了 模板引數類別不能為空。 模板引數表示在類或函式定義中用到的型別或值。 template <typenam

Effective C++: 07模板編程

單向 不可 允許 non-const 內容 卷標 基類 complete ear C++ template機制自身是一部完整的圖靈機(Turing-complete):它可以被用來計算任何可計算的值。於是導出了模板元編程(TMP, template metaprogramm

C++Primer_Chap16_模板程式設計_List03_過載和模板_筆記

  函式模板可以被另一個模板或普通非模板函式過載。與往常一樣,名字相同的函式必須具有不同數量和型別的引數。涉及函式模板,函式匹配規則會在以下幾方面受到影響: 對於一個呼叫,其候選函式包括所有模板實參推斷成功的函式模板例項 候選的函式模板總是可行的,因為模板實參推斷會排除任何

C++Primer_Chap16_模板程式設計_List02_模板實參推斷_筆記

  從函式實參類確定模板實參的過程稱為模板實參推斷(template argument deduction)。 型別轉換和模板型別引數   如果一個函式形參的型別使用了模板型別引數,那麼它採用特殊的初始化規則。只有很有限的幾種型別轉換會自動應用於這些實參。編譯器通常不是對

C++Primer_Chap16_模板程式設計_List01_定義模板_筆記

  面向物件變成(OOP)和泛型程式設計都能處理在編寫程式時不知道型別的情況。不同之處在於: OOP能處理型別在程式執行之前都未知的情況 泛型程式設計中,在編譯時就能獲知型別。 函式模板   我們可以定義一個通用的函式模板(function templ

C++Primer_Chap16_模板程式設計_List05_模板特例化_筆記

  編寫單一模板,使之對任何可能的模板實參都是最合適的,都能例項化,這並不總是能辦到的。當我們不能(或不希望)使用模板版本時,可以定義類或函式模板的一個特例化版本。 定義函式模板特例化   當我們特例化一個函式模板時,必須為原模板中的每個模板引數都提供實參。為了指出我們正

C++Primer_Chap16_模板程式設計_List04_可變引數模板_筆記

  一個可變引數模板(variable template)就是一個接受可變數目引數的模板函式或模板類。可變數目的引數被稱為引數包(parameter packet)。存在兩種引數寶: 模板引數包(template parameter packet),表示0個或多個模板引數

模板程式設計

       當我們希望可以用同一個函式處理不同型別的引數時(比如寫一個加法函式,可以處理各種不同型別的資料)都有哪些方法呢? 1、函式過載(同一作用域;函式名相同;引數列表不同) 缺點:         a、只要有新型別出現,就必須新增對應的函式         b、除了

C++ Primer 第16章】《模板編程》目錄

cnblogs OS pan c++ get In lan microsoft .cn 模板與泛型編程 • 定義模板(16.1) 類模板(16.1.2) 類前置聲明範例 •【C