1 // MyArray.h: interface for the MyArray class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #if !defined(AFX_MYARRAY_H__C353685F_371A_47F8_A9FA_79B110474B9C__INCLUDED_)
6 #define AFX_MYARRAY_H__C353685F_371A_47F8_A9FA_79B110474B9C__INCLUDED_
7
8 #if _MSC_VER > 1000
9 #pragma once
10 #endif // _MSC_VER > 1000
11
12 #include <iostream.h>
13
14 template<typename T>
15 class MyArray
16 {
17 private:
18 T *m_pData;
19 int m_nSpace;
20 int m_nCount;
21
22 public:
23 MyArray()
24 {
25 m_pData = NULL;
26 m_nSpace = m_nCount = 0;
27 }
28
29 virtual ~MyArray()
30 {
31 delete[] m_pData;
32 m_pData = NULL;
33 }
34
35 public:
36 /************************************************************************/
37 /* inline */
38 /************************************************************************/
39 //是否为空
40 bool isEmpty() const
41 {
42 return m_nCount == 0;
43 }
44
45 //获取长度
46 int GetCount() const
47 {
48 return m_nCount;
49 }
50
51 //获取元素
52 T GetElem(int nIndex) const
53 {
54 return m_pData[nIndex];
55 }
56
57 //检查范围
58 bool CheckRange(int nIndex) const
59 {
60 if (nIndex <|| nIndex >= m_nCount)
61 {
62 throw "索引越界";
63 }
64 return true;
65 }
66
67 public:
68 /************************************************************************/
69 /* extern function */
70 /************************************************************************/
71 //检查空间
72 bool CheckSpace();
73
74 //在尾部增加元素
75 void AddTailElem(const T& Object);
76
77 //在索引后插入元素
78 bool InsertElem(int nIndex, const T& Object);
79
80 //删除元素(按索引值删除)
81 void DeleteElem(int nIndex);
82
83 //查找元素(找到后返回索引值,未找到返回-1)
84 int FindElem(const T& Object);
85
86 //打印
87 void Print();
88 };
89
90 template<typename T>
91 bool MyArray<T>::CheckSpace()
92 {
93 if (m_nSpace == m_nCount)
94 {
95 T *pNewSpace = new T[m_nSpace = m_nSpace ? m_nSpace*2 : 1];
96 for (int i = 0; i < m_nCount; i++)
97 {
98 pNewSpace[i] = m_pData[i];
99 }
100
101 delete[] m_pData;
102 m_pData = pNewSpace;
103 }
104
105 return true;
106 }
107
108 template<typename T>
109 void MyArray<T>::AddTailElem(const T& Object)
110 {
111 CheckSpace();
112 m_pData[m_nCount++] = Object;
113 }
114
115 template<typename T>
116 bool MyArray<T>::InsertElem(int nIndex, const T& Object)
117 {
118 CheckRange(nIndex);
119 CheckSpace();
120
121 for (int i = nIndex + 1; i < m_nCount; i++)
122 {
123 m_pData[i + 1] = m_pData[i];
124 }
125 m_pData[nIndex + 1] = Object;
126 m_nCount++;
127
128 return true;
129 }
130
131 template<typename T>
132 void MyArray<T>::DeleteElem(int nIndex)
133 {
134 CheckRange(nIndex);
135
136 for (int i = nIndex; i < m_nCount; i++)
137 {
138 m_pData[i] = m_pData[i + 1];
139 }
140 m_nCount--;
141 }
142
143 template<typename T>
144 int MyArray<T>::FindElem(const T& Object)
145 {
146 for (int i = 0; i < m_nCount; i++)
147 {
148 if (m_pData[i] == Object)
149 {
150 return i;
151 }
152 }
153
154 return -1;
155 }
156
157 template<typename T>
158 void MyArray<T>::Print()
159 {
160 for (int i = 0; i < m_nCount; i++)
161 {
162 cout << m_pData[i] << "\t" << flush;
163 }
164 cout << endl;
165 }
166
167 #endif // !defined(AFX_MYARRAY_H__C353685F_371A_47F8_A9FA_79B110474B9C__INCLUDED_)