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++ 泛型程式設計01:模板】函式模板與類别範本C++泛型程式設計函式
- C++ 泛型程式設計基礎:模板通識C++泛型程式設計
- C++泛型一:模板C++泛型
- c++ 泛型程式設計 之 TypeListsC++泛型程式設計
- c++ 泛型 程式設計 之 Functor 設計模式C++泛型程式設計設計模式
- 泛型程式設計與 OI——modint泛型程式設計
- C++ STL與泛型程式設計-第一篇 (Boolan)C++泛型程式設計
- 泛型程式設計泛型程式設計
- c++ 泛型程式設計 之 自動生成程式碼C++泛型程式設計
- java 泛型程式設計Java泛型程式設計
- 現代c++與模板超程式設計C++程式設計
- c++泛型程式設計中函式模板過載和模板特化同時存在時的查詢規則C++泛型程式設計函式
- 十、GO程式設計模式 : 泛型程式設計Go程式設計設計模式泛型
- C++程式設計模板2C++程式設計
- C++模板超程式設計C++程式設計
- 泛型程式設計詳解(一)泛型程式設計
- C++ 簡單實現陣列類泛型程式設計示例C++陣列泛型程式設計
- C++提高程式設計-模板C++程式設計
- 物件導向程式設計和`GP`泛型程式設計物件程式設計泛型
- 泛型模板化設計DEMO泛型
- .NET泛型程式設計簡介 (轉)泛型程式設計
- 深入實踐c++模板程式設計C++程式設計
- C++模板超程式設計[metaprogram] (轉)C++程式設計
- C++模板超程式設計(C++ template metaprogramming)C++程式設計
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- GO語言泛型程式設計實踐Go泛型程式設計
- 《C++ Primer》 ---- 關於變數 與 基本型別C++變數型別
- 泛型程式設計在非C++語言中的實現之探討 (轉)泛型程式設計C++
- 在C語言中實現泛型程式設計C語言泛型程式設計
- C語言如何實現泛型程式設計?C語言泛型程式設計
- Swift使用協議加泛型程式設計(一)Swift協議泛型程式設計
- Java中的泛型程式設計:深入理解型別引數與型別邊界的使用Java泛型程式設計型別
- Rust 程式設計影片教程(進階)——001 泛型Rust程式設計泛型
- 使用 Go 泛型的函數語言程式設計Go泛型函數程式設計
- 02. 程式設計核心內功心法之泛型程式設計泛型
- [.net 物件導向程式設計基礎] (18) 泛型物件程式設計泛型
- 現代c++模板超程式設計:遍歷tupleC++程式設計
- c++ 模板超程式設計的一點體會C++程式設計