template <typename Object> class ArrayVector { private: int capacity; // length of array int sz; // number of elements in vector Object* a; // array storing the elements protected: void overflow(); // handle overflow by resizing public: ArrayVector(int initCap = 16) { // constructor capacity = initCap; sz = 0; a = new Object[capacity]; } int size() const // number of elements { return sz; } bool isEmpty() const // is vector empty? { return size() == 0; } Object& elemAtRank(int r) // access element at rank r { return a[r]; } void replaceAtRank(int r, const Object& e) // replace element at given rank { a[r] = e; } void removeAtRank(int r); // remove element at given rank void insertAtRank(int r, const Object& e); // insert element at given rank // ... (housekeeping functions omitted) };