#ifndef Vec_h_ #define Vec_h_ // Simple implementation of the vector class, revised from Koenig and Moo. This // class is implemented using a dynamically allocated array (of templated type T). // We ensure that that m_size is always <= m_alloc and when a push_back or resize // call would violate this condition, the data is copied to a larger array. template class Vec { public: // TYPEDEFS typedef unsigned int size_type; // CONSTRUCTORS, ASSIGNMNENT OPERATOR, & DESTRUCTOR Vec() { this->create(); } Vec(size_type n, const T& t = T()) { this->create(n, t); } Vec(const Vec& v) { copy(v); } Vec& operator=(const Vec& v); ~Vec() { delete [] m_data; } // MEMBER FUNCTIONS AND OTHER OPERATORS T& operator[] (size_type i) { return m_data[i]; } const T& operator[] (size_type i) const { return m_data[i]; } void push_back(const T& t); void resize(size_type n, const T& fill_in_value = T()); void clear() { delete [] m_data; create(); } bool empty() const { return m_size == 0; } size_type size() const { return m_size; } private: // PRIVATE MEMBER FUNCTIONS void create(); void create(size_type n, const T& val); void copy(const Vec& v); // REPRESENTATION T* m_data; // Pointer to first location in the allocated array size_type m_size; // Number of elements stored in the vector size_type m_alloc; // Number of array locations allocated, m_size <= m_alloc }; // Create an empty vector (null pointers everywhere). template void Vec::create() { m_data = NULL; m_size = m_alloc = 0; // No memory allocated yet } // Create a vector with size n, each location having the given value template void Vec::create(size_type n, const T& val) { m_data = new T[n]; m_size = m_alloc = n; for (size_type i = 0; i < m_size; i++) { m_data[i] = val; } } // Assign one vector to another, avoiding duplicate copying. template Vec& Vec::operator=(const Vec& v) { if (this != &v) { delete [] m_data; this -> copy(v); } return *this; } // Create the vector as a copy of the given vector. template void Vec::copy(const Vec& v) { } // Add an element to the end, resize if necesssary. template void Vec::push_back(const T& val) { if (m_size == m_alloc) { // Allocate a larger array, and copy the old values } // Add the value at the last location and increment the bound m_data[m_size] = val; ++ m_size; } // If n is less than or equal to the current size, just change the size. If n is // greater than the current size, the new slots must be filled in with the given value. // Re-allocation should occur only if necessary. push_back should not be used. template void Vec::resize(size_type n, const T& fill_in_value) { } #endif