例7.1
使用类模板的实例。
例7.2
求4个数中最大值的类模板程序。
1 #include <iostream> 2 3 using namespace std; 4 5 template <class T> 6 7 class Max4 8 { 9 T a, b, c, d; 10 T Max(T a, T b) 11 { 12 return (a > b) ? a : b; 13 } 14 public: 15 Max4(T, T, T, T); 16 T Max(void); 17 }; 18 19 template <class T>//定义成员函数必须再次声明模板 20 Max4<T>::Max4(T x1, T x2, T x3, T x4) :a(x1), b(x2), c(x3), d(x4) 21 { 22 23 } 24 25 template <class T>//定义成员函数必须再次声明模板 26 T Max4<T>::Max(void)//定义时要将Max4<T>看做整体 27 { 28 return Max(Max(a, b), Max(c, d)); 29 } 30 31 void main() 32 { 33 Max4<char>C('W', 'w', 'a', 'A');//比较字符 34 Max4<int>A(-25, -67, -66, -256);//比较整数 35 Max4<double>B(1.25, 4.3, -8.6, 3.5);//比较双精度实数 36 37 cout << C.Max() << " " << A.Max() << " " << B.Max() << endl;//输出 w -25 4.3 38 39 system("pause"); 40 }
例7.4
设计一个非模板类Point类,然后设计一个继承Point类的类模板Line。
1 #include <iostream> 2 3 using namespace std; 4 5 class Point//非模板类Point 6 { 7 int x, y; 8 public: 9 Point(int a, int b) 10 { 11 x = a; 12 y = b; 13 } 14 void display() 15 { 16 cout << x << "," << y << endl; 17 } 18 }; 19 20 template <typename T>//类模板 21 22 class Line :public Point 23 { 24 T x2, y2; 25 public: 26 Line(int a, int b, T c, T d) :Point(a, b) 27 { 28 x2 = c; 29 y2 = d; 30 } 31 void display() 32 { 33 Point::display(); 34 cout << x2 << "," << y2 << endl; 35 } 36 }; 37 38 void main() 39 { 40 Point a(3, 8);//对象a是整数坐标 41 a.display(); 42 43 Line<int>ab(4, 5, 6, 7);//线段ab的两个坐标均是整数 44 ab.display(); 45 46 Line<double>ad(4, 5, 6.5, 7.8);//线段ad的一个坐标是整数,另一个是实数 47 ad.display(); 48 49 system("pause"); 50 }
例7.5
设计一个模板类Point,然后公有派生一个模板类Line。
1 #include <iostream> 2 3 using namespace std; 4 5 template <typename T> 6 class Point 7 { 8 T x, y; 9 public: 10 Point(T a, T b) 11 { 12 x = a; 13 y = b; 14 } 15 void display() 16 { 17 cout << x << "," << y << endl; 18 } 19 }; 20 21 template <typename T> 22 class Line :public Point<T> 23 { 24 T x2, y2; 25 public: 26 Line(T a, T b, T c, T d) :Point<T>(a, b) 27 { 28 x2 = c; 29 y2 = d; 30 } 31 void display() 32 { 33 Point<T>::display(); 34 cout << x2 << "," << y2 << endl; 35 } 36 }; 37 38 void main() 39 { 40 Point<double>a(3.5, 8.8); 41 a.display(); 42 43 Line<int>ab(4, 5, 6, 7);//全部使用整数 44 ab.display(); 45 46 Line<double>ad(4.5, 5.5, 6.5, 7.5);//全部使用实数 47 ad.display(); 48 49 system("pause"); 50 }
例7.6
演示泛型指针和copy函数的例子。
1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 #include <iterator> 5 6 using namespace std; 7 8 void main() 9 { 10 double a[] = { 1.1,4.4,3.3,2.2 }; 11 vector<double>va(a, a + 4), vb(4);//定义并初始化向量va 12 typedef vector<double>::iterator iterator;//自定义一个正向泛型指针标识符iterator 13 iterator first = va.begin();//定义正向泛型指针first并指向va的首元素 14 15 for (first; first < va.end(); first++)//循环正向输出va 16 { 17 cout << *first << " "; 18 } 19 for (--first; first > va.begin() - 1; first--)//循环逆向输出va 20 { 21 cout << *first << " "; 22 } 23 copy(va.begin(), va.end(), ostream_iterator<double>(cout, " "));//整体正向输出va 24 cout << endl; 25 26 typedef vector<double>::reverse_iterator reverse_iterator;//自定义一个逆向泛型指针标识符 27 reverse_iterator last = va.rbegin();//定义逆向泛型指针last并指向va的尾元素 28 29 for (last; last < va.rend(); last++)//使用逆向指针循环从尾到首输出va 30 { 31 cout << *last << " "; 32 } 33 for (--last; last > va.rbegin() - 1; last--)//使用逆向指针循环从首到尾输出va 34 { 35 cout << *last << " "; 36 } 37 copy(va.rbegin(), va.rend(), ostream_iterator<double>(cout, " "));//整体从尾到首输出va 38 39 system("pause"); 40 }
例7.7
演示向量使用实数类型的例子。
1 #include <iostream> 2 #include <algorithm> 3 #include <functional> 4 #include <vector> 5 #include <iterator> 6 7 using namespace std; 8 9 void main() 10 { 11 double a[] = { 1.1,4.4,3.3,2.2 }; 12 vector<double>va(a, a + 4), vb(4);//定义实数向量va 13 14 copy(va.begin(), va.end(), ostream_iterator<double>(cout, " "));//正向输出va 15 cout << endl; 16 17 reverse_copy(va.begin(), va.end(), ostream_iterator<double>(cout, " "));//逆向输出va 18 cout << endl; 19 20 reverse_copy(va.begin(), va.end(), vb.begin());//va逆向复制给vb 21 22 copy(vb.begin(), vb.end(), ostream_iterator<double>(cout, " "));//正向输出vb 23 cout << endl; 24 25 sort(va.begin(), va.end());//va升幂排序 26 sort(vb.begin(), vb.end(), greater<double>());//vb降幂排序 27 28 copy(va.begin(), va.end(), ostream_iterator<double>(cout, " "));//正向输出va 29 cout << endl; 30 31 copy(vb.begin(), vb.end(), ostream_iterator<double>(cout, " "));//逆向输出vb 32 cout << endl; 33 34 va.swap(vb);//交换va和vb的内容 35 36 copy(va.begin(), va.end(), ostream_iterator<double>(cout, " "));//正向输出va 37 cout << endl; 38 39 copy(vb.begin(), vb.end(), ostream_iterator<double>(cout, " "));//正向输出vb 40 cout << endl; 41 42 cout << *find(va.begin(), va.end(), 4.4);//在va中查找4.4 43 44 system("pause"); 45 }
例7.8
演示使用复数类和结构作为向量数据元素的例子。
1 #include <iostream> 2 #include <complex> 3 #include <vector> 4 5 using namespace std; 6 7 struct st 8 { 9 int a, b; 10 }a[] = { {2,5},{4,8} }; 11 12 void main() 13 { 14 complex<float>num[] = { complex<float>(2,3),complex<float>(3.5,4.5) }; 15 vector<complex<float>*>vnum(2);//复数类的指针作为向量的数据类型 16 17 vnum[0] = &num[0]; 18 vnum[1] = &num[1]; 19 20 for (int i = 0; i < 2; i++) 21 { 22 cout << "real is " << vnum[i]->real() << ",imag is" << vnum[i]->imag() << endl; 23 } 24 25 vector<st *>cp(2);//结构指针作为向量的数据类型 26 cp[0] = &a[0]; 27 cp[1] = &a[1]; 28 29 for (int i = 0; i < 2; i++) 30 { 31 cout << "a=" << cp[i]->a << ",b=" << cp[i]->b << endl; 32 } 33 34 system("pause"); 35 }
例7.11
演示使用泛型指针进行插入和删除实例。
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <iterator> 5 6 using namespace std; 7 8 void main() 9 { 10 char st[11] = "abcdefghij"; 11 12 vector<char>a(st, st + 10);//不复制标志" " 13 vector<char>::iterator p;//定义泛型指针p 14 15 p = a.begin();//p指向第1个元素的指针 16 17 a.insert(p + 3, 'X');//a[3]='X' 18 19 copy(a.begin(), a.end(), ostream_iterator<char>(cout, " "));//输出向量a的内容 20 cout << endl; 21 22 p = a.begin();//p返回首位值 23 24 a.insert(p, 3, 'A');//在a[0]前插入3个A 25 26 copy(a.begin(), a.end(), ostream_iterator<char>(cout, " "));//输出增加A A A后的内容 27 cout << endl; 28 29 a.erase(p + 8);//删除a[8],即第9个元素e 30 31 copy(a.begin(), a.end(), ostream_iterator<char>(cout, " "));//输出删除e之后的内容 32 cout << endl; 33 34 system("pause"); 35 };
例7.12
演示双向访问的例子。
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 void main() 7 { 8 char st[11] = "abcdefghij"; 9 10 vector<char>a(st, st + 10); 11 vector<char>::iterator p = a.begin();//定义正向泛型指针并初始化 12 vector<char>::reverse_iterator ps;//定义逆向泛型指针 13 14 for (p = a.begin(); p != a.end(); ++p)//正向访问 15 { 16 cout << *p << " ";//输出a b c d e f g h i j 17 } 18 cout << endl; 19 20 for (p = a.end() - 1; p != a.begin() - 1; --p)//使用正向泛型指针逆向访问 21 { 22 cout << *p << " ";//输出j i h g f e d c b a 23 } 24 cout << endl; 25 26 for (ps = a.rbegin(); ps != a.rend(); ++ps)//使用逆向泛型指针正向访问,使用++运算 27 { 28 cout << *ps << " ";//输出j i h g f e d c b a 29 } 30 cout << endl; 31 32 for (--ps; ps != a.rbegin() - 1; --ps)//使用逆向泛型指针逆向访问,使用--运算 33 { 34 cout << *ps << " ";//输出a b c d e f g h i j 35 } 36 cout << endl; 37 38 system("pause"); 39 };
出圈游戏
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 class SeqList 7 { 8 char name[10]; 9 public: 10 void DispName() 11 { 12 cout << name; 13 } 14 void SetName(char b[]) 15 { 16 strcpy_s(name, b); 17 } 18 void Joseph(vector<SeqList>&); 19 }; 20 //Joseph函数 21 void SeqList::Joseph(vector<SeqList>&c) 22 { 23 int m, star, i, j, k; 24 25 cout << "请输入间隔数m(m<=20)"; 26 cin >> m;//间隔数 27 while (m > 20)//间隔数大于20,重新输入 28 { 29 cout << "间隔太大,请重新输入:"; 30 cin >> m; 31 } 32 33 cout << "从第几个人的位置开始报数(不能大于" << c.size() << "):"; 34 cin >> star; 35 while (star > c.size()) 36 { 37 cout << "开始位置大于人数,重新输入:"; 38 cin >> star; 39 } 40 41 cout << "准备输入名字" << endl; 42 getchar();//消除回车干扰 43 //输入参加游戏人的名字 44 char s[10]; 45 for (i = 0; i < c.size(); i++) 46 { 47 cout << "第" << i + 1 << "个人的名字:"; 48 gets_s(s); 49 c[i].SetName(s); 50 } 51 52 i = star - 2;//为方便编程,从规定开始报数处再减1作为计数依据 53 vector<SeqList>::iterator p; 54 p = c.begin(); 55 int length = c.size(); 56 for (k = 1; k <= length; k++) 57 { 58 j = 0;//报数 59 while (j < m) 60 { 61 i++; 62 if (i == c.size())//到终点,返回第一个位置计数 63 { 64 i = 0; 65 } 66 j++; 67 } 68 if (k == length) 69 { 70 break; 71 } 72 c[i].DispName();//输出出圈人的信息 73 cout << ","; 74 c.erase(p + i);//删除出圈人的记录 75 --i;//调整计数位置初始值 76 } 77 //break语句跳转至此处,输出最后出列的编号 78 c[i].DispName(); 79 cout << endl; 80 } 81 82 void main() 83 { 84 int length = 0; 85 86 cout << "请输入人数:"; 87 cin >> length; 88 89 vector<SeqList>c(length); 90 SeqList game; 91 game.Joseph(c); 92 93 system("pause"); 94 };