Skip to content

Implementing a container, (example)

A simple insight on how you can also implement your own container:

template <class T>
class Vector {
public:
    typedef T *iterator;

    Vector();
    Vector(unsigned int size);
    Vector(unsigned int size, const T &initial);
    Vector(const Vector<T> &v);
    ~Vector();

    unsigned int capacity() const;
    unsigned int size() const;
    bool empty() const;
    iterator begin();
    iterator end();
    T &front();
    T &back();
    void push_back(const T &value);
    void pop_back();

    void reserve(unsigned int capacity);
    void resize(unsigned int size);

    T &operator[](unsigned int index);
    Vector<T> &operator=(const Vector<T> &);
    void clear();

private:
    unsigned int my_size;
    unsigned int my_capacity;
    T *buffer;
};

// Your code goes here ...
template <class T>
Vector<T>::Vector() {
    my_capacity = 0;
    my_size = 0;
    buffer = 0;
}

template <class T>
Vector<T>::Vector(const Vector<T> &v) {
    my_size = v.my_size;
    my_capacity = v.my_capacity;
    buffer = new T[my_size];
    for (unsigned int i = 0; i < my_size; i++)
        buffer[i] = v.buffer[i];
}

template <class T>
Vector<T>::Vector(unsigned int size) {
    my_capacity = size;
    my_size = size;
    buffer = new T[size];
}

template <class T>
Vector<T>::Vector(unsigned int size, const T &initial) {
    my_size = size;
    my_capacity = size;
    buffer = new T[size];
    for (unsigned int i = 0; i < size; i++)
        buffer[i] = initial;
    // T();
}

template <class T>
Vector<T> &Vector<T>::operator=(const Vector<T> &v) {
    delete[] buffer;
    my_size = v.my_size;
    my_capacity = v.my_capacity;
    buffer = new T[my_size];
    for (unsigned int i = 0; i < my_size; i++)
        buffer[i] = v.buffer[i];
    return *this;
}

template <class T>
typename Vector<T>::iterator Vector<T>::begin() {
    return buffer;
}

template <class T>
typename Vector<T>::iterator Vector<T>::end() {
    return buffer + size();
}

template <class T>
T &Vector<T>::front() { return buffer[0]; }

template <class T>
T &Vector<T>::back() { return buffer[my_size - 1]; }

template <class T>
void Vector<T>::push_back(const T &v) {
    if (my_size >= my_capacity)
        reserve(my_capacity + 5);
    buffer[my_size++] = v;
}

template <class T>
void Vector<T>::pop_back() { my_size--; }

template <class T>
void Vector<T>::reserve(unsigned int capacity) {
    if (buffer == 0) {
        my_size = 0;
        my_capacity = 0;
    }
    T *Newbuffer = new T[capacity];
    // assert(Newbuffer);
    unsigned int l_Size = capacity < my_size ? capacity : my_size;
    // copy (buffer, buffer + l_Size, Newbuffer);

    for (unsigned int i = 0; i < l_Size; i++)
        Newbuffer[i] = buffer[i];

    my_capacity = capacity;
    delete[] buffer;
    buffer = Newbuffer;
}

template <class T>
unsigned int Vector<T>::size() const //
{
    return my_size;
}

template <class T>
void Vector<T>::resize(unsigned int size) {
    reserve(size);
    my_size = size;
}

template <class T>
T &Vector<T>::operator[](unsigned int index) {
    return buffer[index];
}

template <class T>
unsigned int Vector<T>::capacity() const {
    return my_capacity;
}

template <class T>
Vector<T>::~Vector() { delete[] buffer; }
template <class T>
void Vector<T>::clear() {
    my_capacity = 0;
    my_size = 0;
    buffer = 0;
}
template <typename T> 
class stack {
  vector<T> arr;

public:
  bool empty(){
    return arr.empty();
  }
  T pop() {
    T temp = arr[arr.size() - 1];
    arr.pop_back();
    return temp;
  }
  T top() { return arr[arr.size() - 1]; }
  void push(T value) { arr.push_back(value); }
};

or

const int SIZE = 10;

// create generic class stack
template <class StackType> class stack{
    StackType stack[SIZE]; // holds the stack
    int tos; //index of top of stack
    public:
        stack(){tos =0;}
        void push(StackType ob);
        StackType pop();
};
// push an object
template <class StackType> void stack<StackType>::push(StackType ob){
    if(tos==SIZE){
        cout << "Stack overflow";
        return;
    }
    stack[tos]=ob;
    tos++;
}
template <class StackType> StackType stack<StackType>::pop(){
    if(tos==0){
        cout <<"stack is empty";
    } 
    tos--;
    return stack[tos];
}