定义一个向量(vector)模板类,实现向量的初始化、插入、删除操作:
1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 #define default_capacity 3 5 template <typename T> 6 class vector 7 { 8 private: 9 int size; 10 int capacity; 11 T* elem; 12 public: 13 vector(); 14 void expand(); 15 void shrink(); 16 void insert(T &e,int i); 17 void remove(int i); 18 void print(); 19 T & operator[](int r); //重载下标操作符,可以类似于数组形式引用各元素 20 int getsize(); 21 int binsearch(); 22 }; 23 template <typename T> 24 vector <T>::vector() 25 { 26 capacity = default_capacity; 27 elem = new T[capacity]; 28 size = 0; 29 } 30 31 template <typename T> 32 void vector<T>::expand() 33 { 34 if (size < capacity) return; //规模小于容量 35 T* oldelem = elem; 36 elem = new T[capacity <<=1]; 37 for (int i = 0;i < size;i++) 38 elem[i] = oldelem[i]; 39 delete[] oldelem; 40 } 41 42 template <typename T> 43 void vector<T>::shrink() 44 { 45 if (capacity < default_capacity) 46 { 47 return; 48 }//容量小于初始容量 49 if ((size * 4) <= capacity) 50 { 51 T *oldelem = elem; 52 elem = new T[capacity >>= 1]; 53 for (int i = 0;i < size;i++) 54 elem[i] = oldelem[i]; 55 delete[]oldelem; 56 } 57 } 58 59 template <typename T> 60 void vector<T>::insert(T&e,int i) 61 { 62 expand(); 63 for (int j = size;j > r;j++) 64 { 65 elem[i] = elem[i - 1]; 66 } 67 elem[i] = e; 68 size++; 69 } 70 71 template <typename T> 72 void vector<T>::remove(int i) 73 { 74 int j; 75 T e = elem[i]; 76 for (j = i + 1;j < size;j++) 77 { 78 elem[j - 1] = elem[j]; 79 } 80 size--; 81 shrink(); 82 return e; 83 } 84 85 template <typename T> 86 void vector<T>::print() 87 { 88 int i; 89 for (i = 0;i < size;i++) 90 cout << elem[i] << endl; 91 cout << endl; 92 } 93 94 template <typenmae T> 95 T & vector<T>::operator[](int r) 96 { 97 return elem[r]; 98 } 99 100 template <typename T> 101 int vector<T>::getsize() 102 { 103 return size; 104 } 105 106 template <typename T> 107 int vector<T>::binsearch(T *A,T const& e,T lo,t hi) 108 { 109 while (lo < hi) 110 { 111 T mi = (lo + hi) >> 1; 112 if (e < A[mi])hi = mi; 113 else if (A[mi] < e)lo = mi + 1; 114 else return mi; 115 } 116 return -1; //查找失败 117 }