码迷,mamicode.com
首页 > 编程语言 > 详细

动态数组vector

时间:2017-09-18 14:49:27      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:using   依次   let   rail   else   val   个数   private   复制   

动态数组

  动态数组可以实现长度的自由变化,但是通过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 }

 

动态数组vector

标签:using   依次   let   rail   else   val   个数   private   复制   

原文地址:http://www.cnblogs.com/yan1314/p/7542713.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!