动态数组
动态数组可以实现长度的自由变化,但是通过vector的默认值可以基本判断所谓动态数组实际上还是一个普通数组,传递一个参数确定数组长度,如果没有传递参数,程序中其实默认进行设定。如果插入数据之后超过了已有长度,则在内部进行了一个创建第三方的过程,将现在的数组保存起来,然后再次创建一个新的长度的数组,然后根据插入值进行重新整合。
笔者并未看过源码,只是按照功能试着进行实现。
1.array.h
1 #pragma once 2 3 #include <iostream> 4 using namespace std; 5 6 7 8 template <typename T> 9 class Array 10 { 11 private: 12 T * Arr; //动态数组首地址 13 int iRail_Pos; //动态数组最后元素位置 14 int IsBlank; //判断是否为空,0为空,1为非空 15 int Len ; //数组长度 16 public: 17 Array(); //初始化动态数组,不初始化元素个数,是一个空数组 18 Array(int n); //初始化动态数组,元素个数为n 19 void Push_Back(T val); //在尾部添加元素 20 void Pop_Back(); //在尾部删除元素 21 void Show(); //显示数组 22 bool IsEmpty(); //判断是否为空 23 int Insert(int pos, T elem); //在pos插入元素elem, 并返回pos 24 int Delete(int pos); //在pos删除元素elem,并返回pos 25 T At(int idx); //通过下标idx索引数组中的元素 26 }; 27 28 29 30 31 32 33 //构造函数,自己设定数组长度 34 template <typename T> 35 Array<T>::Array(int n) 36 { 37 Len = n; 38 Arr = new T [Len]; 39 IsBlank = 0; //0为空,1为非空 40 iRail_Pos = 0; 41 } 42 43 44 45 46 47 //构造函数,默认长度为3 48 template <typename T> 49 Array<T>::Array() 50 { 51 Len = 3; 52 Arr = new T[Len]; //默认为3 53 IsBlank = 0; //0为空,1为非空 54 iRail_Pos = 0; 55 } 56 57 58 59 60 //在尾部添加元素 61 template <typename T> 62 void Array<T>::Push_Back(T val) //给动态数组赋值,只能按顺序从尾部依次赋值 63 { 64 if (iRail_Pos < Len) //如果Push_Back元素小于Len,则直接赋值val给Arr[iRail_Pos] 65 { 66 Arr[iRail_Pos] = val; 67 iRail_Pos++; 68 IsBlank = 1; 69 } 70 else 71 { 72 T * Copy_Array = new T[iRail_Pos]; //如果Push_Back元素超出了范围Len, 创建一个拷贝数组,用于保存原数组 73 for (int i = 0; i < iRail_Pos; i++) 74 Copy_Array[i] = Arr[i]; 75 delete[] Arr; //释放Arr 76 Arr = new T[iRail_Pos+1]; //再次创建一个新的数组Arr,长度 + 1 77 for (int i = 0; i < iRail_Pos; i++) 78 Arr[i] = Copy_Array[i]; 79 delete[] Copy_Array; 80 Arr[iRail_Pos] = val; 81 IsBlank = 1; 82 iRail_Pos++; 83 } 84 } 85 86 87 88 89 //在pos插入元素elem, 并返回pos 90 template <typename T> 91 int Array<T>::Insert(int pos, T elem) 92 { 93 //如果插入位置在pos之前 94 if (pos <= iRail_Pos && pos > 0) 95 { 96 int m = pos; 97 int n = pos + 1; 98 T * Copy_Array = new T[iRail_Pos]; //如果Push_Back元素超出了范围Len, 创建一个拷贝数组,用于保存原数组 99 for (int i = 0; i < iRail_Pos; i++) 100 Copy_Array[i] = Arr[i]; 101 delete[] Arr; //释放Arr 102 Arr = new T[iRail_Pos + 1]; //再次创建一个新的数组Arr,长度 + 1 103 for (int i = 0; i < pos; i++) //----拷贝pos前元素 104 Arr[i] = Copy_Array[i]; 105 106 Arr[pos] = elem; //-----将val装到pos位置 107 108 for (int i = 0; i < iRail_Pos - pos; i++) //-----拷贝pos后元素 109 { 110 Arr[n] = Copy_Array[m]; 111 n++; 112 m++; 113 } 114 iRail_Pos++; 115 delete[] Copy_Array; 116 } 117 118 //如果插入位置在pos之后 119 if (pos > iRail_Pos) 120 { 121 T * Copy_Array = new T[iRail_Pos]; //如果Push_Back元素超出了范围Len, 创建一个拷贝数组,用于保存原数组 122 for (int i = 0; i < iRail_Pos; i++) 123 Copy_Array[i] = Arr[i]; 124 delete[] Arr; //释放Arr 125 Arr = new T[pos + 1]; //再次创建一个新的数组Arr,长度 + 1 126 for (int i = 0; i < iRail_Pos; i++) 127 Arr[i] = Copy_Array[i]; 128 Arr[pos - 1] = elem; 129 iRail_Pos = pos; 130 delete[] Copy_Array; 131 } 132 133 if (pos < 0) 134 cout << "请输入正确pos!" << endl; 135 return pos; 136 } 137 138 //显示元素 139 template <typename T> 140 void Array<T>::Show() //显示数组 141 { 142 for (int i = 0; i < iRail_Pos; i++) 143 { 144 cout << Arr[i] << " "; 145 } 146 cout << endl; 147 } 148 149 150 151 152 //判断是否为空,true为空,false为非空 153 template <typename T> 154 bool Array<T>::IsEmpty() 155 { 156 if (IsBlank == 0) 157 return true; 158 else 159 return false; 160 } 161 162 163 164 165 166 167 168 template <typename T> 169 int Array<T>::Delete(int pos) //在pos删除元素elem,并返回pos 170 { 171 172 if (IsBlank) //如果非空 173 { 174 int m = pos; 175 int n = pos + 1; 176 T * a = new T[iRail_Pos]; 177 for (int i = 0; i < iRail_Pos; i++) //复制动态数组 178 a[i] = Arr[i]; 179 for (int i = 0; i < iRail_Pos - pos + 1; i++) 180 { 181 Arr[m] = a[n]; 182 n++; 183 m++; 184 } 185 iRail_Pos--; 186 } 187 else 188 cout << "数组为空,不能执行Delete操作!" << endl; 189 190 return pos; 191 } 192 193 template <typename T> 194 void Array<T>::Pop_Back() //在尾部删除元素 195 { 196 if (IsBlank) //如果非空 197 { 198 Arr[iRail_Pos] = 0; 199 iRail_Pos--; 200 } 201 else 202 cout << "数组为空,不能执行Pop_Back操作!" << endl; 203 } 204 205 206 template <typename T> 207 T Array<T>::At(int idx) //通过下标idx索引数组中的元素 208 { 209 if (IsBlank) //如果非空 210 return Arr[idx]; 211 else 212 cout << "数组为空,不能执行At操作!" << endl; 213 }
2.main.cpp
1 #include "array.h" 2 3 int main() 4 { 5 Array<int> arr; 6 7 if (arr.IsEmpty()) 8 cout << "空" << endl; 9 else 10 cout << "非空" << endl; 11 12 arr.Delete(2); 13 14 arr.Push_Back(1); 15 arr.Push_Back(2); 16 arr.Push_Back(3); 17 arr.Push_Back(4); 18 arr.Push_Back(5); 19 20 arr.Show(); 21 22 arr.Insert(1, 99); 23 arr.Insert(10, 888); 24 25 arr.Show(); 26 27 arr.Insert(-10, 888); 28 arr.Push_Back(11); 29 arr.Delete(2); 30 31 arr.Show(); 32 33 arr.Pop_Back(); 34 35 arr.Show(); 36 37 if (arr.IsEmpty()) 38 cout << "空" << endl; 39 else 40 cout << "非空" << endl; 41 42 cout << "arr.At(7) = " << arr.At(7) << endl; 43 44 45 system("pause"); 46 47 return 0; 48 }
时间: 2024-10-22 05:20:26