动态数组vector

动态数组

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

动态数组vector的相关文章

c++动态数组vector

(这篇随笔主要和大家分享一下在信竞中c++中动态数组vector的用法,那些跟竞赛没毛关系的就不说了..) 相信大家都知道c++里有一个nb的STL模板库..(在这里膜一下STL) 今天我们就要扯一扯这里面的一个容器:动态数组vector. vector实际上类似于a[]这个东西,也就是说它重载了[]运算符.(真是66666666) 使用vector时需要加上<vector>这个头文件. 定义方法:vector <类型名> 变量名; 例: vector <int> a;

动态数组 - vector

1 #include <iostream> 2 #include <vector> // 头文件 3 using namespace std; 4 5 int main() 6 { 7 vector<int> v; // 定义一个动态数组 vector<T> v; 8 9 // 几种初始化方式: 10 vector<int> v1(7); // v1中会含有7个元素size() == 7, 都赋值为0 11 vector<int> v

论STL的动态数组vector的基本应用

STL,就是c++的标准数据库,今天要讲的就是附属与它的vector的基本应用. 个人来说,我认为这个东东基本上没有什么用,但是总归得看懂吧... 这是一个动态的数组,可以随时定义它的大小(长度) 除了用万能头文件(bits/stdc++.h)的人,其它都要加上#include<vector>,如果只用BITS时报错,那就把这个加上吧. 定义位置:和定义普通数组一样. 定义方法:vector<数组类型名>数组名: 如果想定义多维数组,可以:vector<vector<数

动态数组索引越界问题

1.在C++中,可以采用几种不同的方法创建一个某种类型T的对象的数组.3种常用的方法如下: #define N 10 //数组的长度N在编译时已知 T static_array[10]; int n = 20; //数组的长度n是在运行时计算的 T* dynamic_array = new T[n]; std::vector<T> vector_array; //数组的长度可以在运行时进行修改 当然,我们仍然可以使用calloc()和malloc()函数,并且这样的程序仍然能够通过编译并顺利运

c++ -- 动态数组

一.关于数组的使用,有几个特殊的地方需要注意: 1.一维数组名可当做指针 具体应用:一维数组/二维数组的传参(参见博客“c++ --二维数组参数传递http://www.cnblogs.com/cygalaxy/p/6963789.html”) 2.动态数组 具体应用:根据实际需要为数组开辟具体大小. int *p; //声明动态数组p为全局变量,在函数内确定实际长度 int main() { int a=5; p=new int(a*sizeof(int)); //为动态数组p开辟5个int元

动态数组 - ArrayList

前言 如果数组的大小要随时间变化,那么数组操作起来就比较麻烦. 在C++中,这种情况要用到动态向量Vector. 而Java中,提供了一种叫做ArrayList的泛型数组结构类型,提供相似的作用. 其实都是一种东西,只是在使用上面有那么一点区别. 本文将讲解ArrayList的具体使用方法. ArrayList常用方法 先要做如下说明: 1. 因为 Java 不支持运算符的重载,所以不支持下标运算符,无法使用[]运算符来存取元素. 2. ArrayList成员必须是对象类型(泛型不支持基本类型)

Java动态数组ArrayList

1.类结构: ·        java.lang.Object ·                         java.util.AbstractCollection<E> ·                                         java.util.AbstractList<E> ·                                                          java.util.ArrayList<E&

【足迹C++primer】40、动态数组

动态数组 C++语言定义了另外一种new表达式语法,可以分配并初始化一个对象数组.标准库中包含 一个名为allocator的类,允许我们将分配和初始化分离. 12.2.1 new和数组 void fun1() { int *pia=new int[2]; //pia指向第一个int //方括号中的大小必须是整型,但不必是常量 typedef int arrT[42]; //arrT表示42个int的数组类型 int *p=new arrT; //分配一个42个int的数组:p指向第一个int /

C基础 万能动态数组

引言 - 动态数组切入 开发中动态类型无外乎list 或者 vector, 这里就是在C中实现vector结构容器部分. 对于C中使用的数据结构, 可以参照下面感觉很不错框架源码学习 , 感觉是<<C接口与实现>>的标准Demo twemproxy  https://github.com/twitter/twemproxy/tree/master/src 写的很清楚易懂, 给人一种铺面而来的美感. 关于动态数组设计的总思路, 主要体现在下面的数组结构 struct array {}