-
Notifications
You must be signed in to change notification settings - Fork 0
/
Vector.h
148 lines (110 loc) · 1.8 KB
/
Vector.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#ifndef Vector_H
#define Vector_H
#include "Vector.h"
using std::cout;
template <class T> class Vector
{
public:
Vector(unsigned int = 0);
Vector(const Vector &);
~Vector();
unsigned int size();
unsigned int capacity();
void push_back(T);
void pop_back();
T& operator[](unsigned int );
private:
unsigned int get_capacity(unsigned int);
unsigned int m_size;
unsigned int m_capacity;
T * array;
};
template <class T>
Vector<T>::Vector(unsigned int s)
{
m_size = s;
if (s!=0)
{
m_capacity = get_capacity(s);
array = new T [m_capacity];
}
array = new T [1];
}
template <class T>
Vector<T>::Vector(const Vector &obj)
{
m_size = obj.m_size;
m_capacity = obj.m_capacity;
array = new T [m_capacity];
for (int i = 0; i < m_size; ++i)
{
array[i] = obj.array[i];
}
}
template <class T>
Vector<T>::~Vector()
{
if (array !=NULL)
{
delete [] array;
}
}
template <class T>
unsigned int Vector<T>::size()
{
return m_size;
}
template <class T>
unsigned int Vector<T>::capacity()
{
return m_capacity;
}
template <class T>
unsigned int Vector<T>::get_capacity(unsigned int n)
{
if (n==0)
return 0;
unsigned int mask = 1;
mask<<=31;
while (!(mask & n))
mask>>=1;
if (mask!=n)
mask<<=1;
return mask;
}
template <class T>
void Vector<T>::push_back(T val)
{
if (m_size+1 > m_capacity)
{
m_capacity = get_capacity(m_size+1);
T * temp = new T[m_size];
for (int i = 0; i < m_size; ++i)
{
temp[i] = array[i];
}
delete [] array;
array = new T[m_capacity];
for (int i = 0; i < m_size; ++i)
{
array[i] = temp [i];
}
}
++m_size;
array[m_size-1] = val;
}
template <class T>
void Vector<T>::pop_back()
{
if (m_size==0)
{
return;
}
m_size--;
}
template <class T>
T& Vector<T>::operator[](unsigned int i)
{
return array[i];
}
#endif