C includeiostream using namespace std templatetypename T T

















































![void Calculator: : Run(void) { char c[20]; while(cin>>c, *c != 'q') switch(*c) { case void Calculator: : Run(void) { char c[20]; while(cin>>c, *c != 'q') switch(*c) { case](https://slidetodoc.com/presentation_image/38c16cc80b2adaf37fe8e1a491fecf0a/image-50.jpg)













![直接插入排序函数模板(9_11. h) template <class T> void Insertion. Sort(T A[], int n) { int i, 直接插入排序函数模板(9_11. h) template <class T> void Insertion. Sort(T A[], int n) { int i,](https://slidetodoc.com/presentation_image/38c16cc80b2adaf37fe8e1a491fecf0a/image-64.jpg)








![顺序查找函数模板 template <class T> int Seq. Search(T list[], int n, T key) { for(int 顺序查找函数模板 template <class T> int Seq. Search(T list[], int n, T key) { for(int](https://slidetodoc.com/presentation_image/38c16cc80b2adaf37fe8e1a491fecf0a/image-73.jpg)




- Slides: 77
C++语言程序设计 清华大学 郑莉 求绝对值函数的模板 函 数 模 板 #include<iostream> using namespace std; template<typename T> T abs(T x) { return x<0? -x: x; int main() { int n=-5; double d=-5. 5; cout<<abs(n)<<endl; cout<<abs(d)<<endl; } } 运行结果: 5 5
C++语言程序设计 清华大学 郑莉 例9 -2 类模板应用举例 类 模 板 #include <iostream> #include <cstdlib> using namespace std; // 结构体Student struct Student { int id; //学号 float gpa; //平均分 }; 9
template <class T> // 提取数据函数的实现 T Store<T>: : Get. Elem(void) { // 如果试图提取未初始化的数据,则终止程序 if (have. Value == 0) { cout << "No item present!" << endl; exit(1); } return item; // 返回item中存放的数据 } template <class T> // 存入数据函数的实现 void Store<T>: : Put. Elem(T x) { // 将have. Value 置为 TRUE,表示item中已存入数值 have. Value++; item = x; // 将x值存入item } 11
int main() { Student g= {1000, 23}; Store<int> S 1, S 2; Store<Student> S 3; Store<double> D; S 1. Put. Elem(3); S 2. Put. Elem(-7); cout << S 1. Get. Elem() << " " <<S 2. Get. Elem()<<endl; S 3. Put. Elem(g); cout << "The student id is " <<S 3. Get. Elem(). id<<endl; cout << "Retrieving object D " ; cout << D. Get. Elem() << endl; //输出对象D的数据成员 // 由于D未经初始化, 在执行函数D. Get. Element()时出错 } 12
#ifndef ARRAY_CLASS 动态数组类模板程序 #define ARRAY_CLASS using namespace std; #include <iostream> #include <cstdlib> #ifndef NULL const int NULL = 0; #endif // NULL enum Error. Type { invalid. Array. Size, memory. Allocation. Error, index. Out. Of. Range }; char *error. Msg[] = { "Invalid array size", "Memory allocation error", "Invalid index: " }; 17
template <class T> class Array { private: T* alist; int size; void Error(Error. Type error, int bad. Index=0) const; public: Array(int sz = 50); Array(const Array<T>& A); ~Array(void); Array<T>& operator= (const Array<T>& rhs); T& operator[](int i); operator T* (void) const; int List. Size(void) const; void Resize(int sz); }; 18
C++语言程序设计 清华大学 郑莉 数组类的拷贝构造函数 直 接 访 问 的 线 性 群 体 template <class T> Array<T>: : Array(const Array<T>& X) { int n=X. size; size=n; alist=new T[n]; if (alist==NULL) Error(memory. Allocation. Error); T* srcptr=X. alist; // X. alist是对象X的数组首地址 T* destptr=alist; // alist是本对象中的数组首地址 while(n--) // 逐个复制数组元素 *destptr++ = *srcptr++; } 20
C++语言程序设计 清华大学 郑莉 浅拷贝 A A的数组元素 占用的内存 alist size template <class T> Array<T>: : Array( const Array<T>& X) { size = X. size; alist= X. alist; } 拷贝前 A alist size B alist size int main() { Array<int> A(10); . . . Array<int> B(A); . . . } A的数组元素 占用的内存 拷贝后 21
C++语言程序设计 清华大学 郑莉 数组类的重载"="运算符函数 直 接 访 问 的 线 性 群 体 template <class T> Array<T>& Array<T>: : operator=(const Array<T>& rhs) { int n = rhs. size; if (size != n) { delete [] alist; alist = new T[n]; if (alist == NULL) Error(memory. Allocation. Error); size = n; } T* destptr = alist; T* srcptr = rhs. alist; while (n--) *destptr++ = *srcptr++; return *this; } 23
C++语言程序设计 清华大学 郑莉 指针转换运算符的作用 直 接 访 问 的 线 性 群 体 #include <iostream> using namespace std; int main() { int a[10]; void read(int *p, int n); read(a, 10); } void read(int *p, int n) { for (int i=0; i<n; i++) cin>>p[i]; } int main() { Array<int> a(10); void read(int *p, n); read(a, 10); } void read(int *p, int n) { for (int i=0; i<n; i++) cin>>p[i]; } 27
#include <iostream> #include <iomanip> #include "9_3. h" using namespace std; int main() { Array<int> A(10); int n; int primecount = 0, i, j; cout << "Enter a value >= 2 as upper limit for prime numbers: "; cin >> n; A[primecount++] = 2; // 2是一个质数 for(i = 3; i < n; i++) { if (primecount == A. List. Size()) A. Resize(primecount + 10); if (i % 2 == 0) continue; j = 3; while (j <= i/2 && i % j != 0) j += 2; if (j > i/2) A[primecount++] = i; } for (i = 0; i < primecount; i++) { cout << setw(5) << A[i]; if ((i+1) % 10 == 0) cout << endl; } 29
C++语言程序设计 清华大学 郑莉 单链表的结点类模板 顺 序 访 问 的 线 性 群 体 template <class T> class Node { private: Node<T> *next; public: T data; Node(const T& item, Node<T>* ptrnext = NULL); void Insert. After(Node<T> *p); Node<T> *Delete. After(void); Node<T> *Next. Node(void) const; }; 32
C++语言程序设计 清华大学 郑莉 删除结点之后的结点 顺 序 访 问 的 线 性 群 体 … data 1 data 2 data 3 … temp. Ptr Node<T> *Node<T>: : Delete. After(void) { Node<T> *temp. Ptr = next; if (next == NULL) return NULL; next = temp. Ptr->next; return temp. Ptr; } 34
C++语言程序设计 清华大学 郑莉 链表类模板(例9 -6) 顺 序 访 问 的 线 性 群 体 //9_6. h #ifndef LINKEDLIST_CLASS #define LINKEDLIST_CLASS #include <iostream> #include <cstdlib> using namespace std; #ifndef NULL const int NULL = 0; #endif // NULL #include "9_5. h" template <class T> class Linked. List {private: Node<T> *front, *rear; Node<T> *prev. Ptr, *curr. Ptr; int size; int position; Node<T> *Get. Node(const T& item, Node<T> *ptr. Next=NULL); void Free. Node(Node<T> *p); void Copy. List( const Linked. List<T>& L); public: Linked. List(void); Linked. List(const Linked. List<T>& L); ~Linked. List(void); Linked. List<T>& operator=( const Linked. List<T>& L); int List. Size(void) const; int List. Empty(void) const; void Reset(int pos = 0); void Next(void); int End. Of. List(void) const; int Current. Position(void) const; void Insert. Front(const T& item); void Insert. Rear(const T& item); void Insert. At(const T& item); void Insert. After(const T& item); T Delete. Front(void); void Delete. At(void); T& Data(void); void Clear. List(void); }; #endif // LINKEDLIST_CLASS 36
C++语言程序设计 顺 序 访 问 的 线 性 群 体 清华大学 郑莉 链表类应用举例(例9 -7) #include <iostream> #include "9_6. h" #include "9_6. cpp" using namespace std; int main() { Linked. List<int> Link; int i, key, item; for (i=0; i < 10; i++) { cin>>item; Link. Insert. Front(item); } cout << "List: "; Link. Reset(); while(!Link. End. Of. List()) { cout<<Link. Data()<<" "; Link. Next(); } cout << endl; cout << "请输入一个需要删除的整数: "; cin >> key; Link. Reset(); while (!Link. End. Of. List()) { if(Link. Data() == key) Link. Delete. At(); Link. Next(); } cout << "List: "; Link. Reset(); while(!Link. End. Of. List()) { cout <<Link. Data() << " "; Link. Next(); } cout << endl; } 38
C++语言程序设计 清华大学 郑莉 —— 特 栈类模板(例9 -8) 殊 的 //9 -8. h public: 线 #ifndef STACK_CLASS Stack (void); 性 #define STACK_CLASS void Push (const T& item); 群 #include <iostream> T Pop (void); 体 #include <cstdlib> void Clear. Stack(void); using namespace std; const int Max. Stack. Size=50; 栈 template <class T> class Stack {private: T stacklist[Max. Stack. Size]; int top; T Peek (void) const; int Stack. Empty(void) const; int Stack. Full(void) const; }; //类的实现略 45
//9_9. h #include <iostream> #include <cmath> #include <cstdlib> #include <cstring> using namespace std; enum Boolean {False, True}; #include "9_8. h" class Calculator { private: Stack<int> S; void Enter(int num); Boolean Get. Two. Operands(int& opnd 1, int& opnd 2); void Compute(char op); public: void Run(void); void Clear(void); }; 47
void Calculator: : Enter(int num) { S. Push(num); } Boolean Calculator: : Get. Two. Operands( int& opnd 1, int& opnd 2) { if (S. Stack. Empty()) { cerr << "Missing operand!" << endl; return False; } opnd 1 = S. Pop(); if (S. Stack. Empty()) { cerr << "Missing operand!" << endl; return False; } opnd 2 = S. Pop(); return True; } 48
void Calculator: : Compute(char op) { Boolean result; int operand 1, operand 2; result = Get. Two. Operands(operand 1, operand 2); if (result) { switch(op) { case '+': S. Push(operand 2+operand 1); break; case '-': S. Push(operand 2 -operand 1); break; case '*': S. Push(operand 2*operand 1); break; case '/': if (operand 1 == 0) { cerr<<"Divide by 0!"<<endl; S. Clear. Stack(); } else S. Push(operand 2/operand 1); break; case '^': S. Push(pow(operand 2, operand 1)); break; } cout<<'='<<S. Peek()<<' '; } else S. Clear. Stack(); } 49
void Calculator: : Run(void) { char c[20]; while(cin>>c, *c != 'q') switch(*c) { case 'c': S. Clear. Stack(); break; case '-': if (strlen(c)>1) Enter(atoi(c)); else Compute(*c); break; case '+': case '*': case '/': case '^': Compute(*c); break; default: Enter(atoi(c)); break; } } void Calculator: : Clear(void) { S. Clear. Stack(); } 50
//9_9. cpp #include "9 -9. h" int main() { Calculator CALC; CALC. Run(); } 51
C++语言程序设计 —— 特 殊 的 线 性 群 体 队 列 清华大学 郑莉 例9 -10 队列类模板 #ifndef QUEUE_CLASS #define QUEUE_CLASS #include <iostream> #include <cstdlib> using namespace std; const int Max. QSize=50; template <class T> class Queue { private: int front, rear, count; T qlist[Max. QSize]; public: Queue (void); void QInsert(const T& item); T QDelete(void); void Clear. Queue(void); T QFront(void) const; int QLength(void) const; int QEmpty(void) const; int QFull(void) const; }; //成员函数的实现略 57
直接插入排序函数模板(9_11. h) template <class T> void Insertion. Sort(T A[], int n) { int i, j; T temp; for (i = 1; i < n; i++) { j = i; temp = A[i]; while (j > 0 && temp < A[j-1]) { A[j] = A[j-1]; j--; } A[j] = temp; } } 64
template <class T> 直接选择排序函数模板(9 -12. h) void Swap (T &x, T &y) { T temp; temp = x; x = y; y = temp; } template <class T> void Selection. Sort(T A[], int n) { int small. Index; int i, j; for (i = 0; i < n-1; i++) { small. Index = i; for (j = i+1; j < n; j++) if (A[j] < A[small. Index]) small. Index = j; Swap(A[i], A[small. Index]); } } 67
C++语言程序设计 清华大学 郑莉 例9 -13 起泡排序函数模板 群 体 数 据 的 组 织 template <class T> void Swap (T &x, T &y) { T temp; temp = x; x = y; y = temp; } template <class T> void Bubble. Sort(T A[], int n) {int i, j; int last. Exchange. Index; i = n-1; while (i > 0) { last. Exchange. Index = 0; for (j = 0; j < i; j++) if (A[j+1] < A[j]) { Swap(A[j], A[j+1]); last. Exchange. Index=j; } i=last. Exchange. Index; } } 71
顺序查找函数模板 template <class T> int Seq. Search(T list[], int n, T key) { for(int i=0; i < n; i++) if (list[i] == key) return i; return -1; } 73
C++语言程序设计 清华大学 郑莉 例9 -15 折半查找函数模板 群 体 数 据 的 组 织 template <class T> int Bin. Search(T list[], int n, T key) { int mid, low, high; T midvalue; low=0; high=n-1; while (low <= high) { mid = (low+high)/2; midvalue = list[mid]; if (key == midvalue) return mid; else if (key < midvalue) high = mid-1; else low = mid+1; } return -1; } 76