#include <algorithm>
#include <iostream>

class arreglo_dinamico {                     // esta implementación todavía tiene aspectos a mejorar o corregir
   int cap, tam;
   int* p;

public:
   arreglo_dinamico( ) {                     // constructor por defecto
      cap = 1;
      tam = 0;
      p = new int[1];
   }

   arreglo_dinamico(arreglo_dinamico& v) {   // constructor por copia
      cap = v.tam;
      tam = v.tam;
      p = new int[cap];
      for (int i = 0; i < tam; ++i) {
         p[i] = v.p[i];
      }
   }

   ~arreglo_dinamico( ) {                    // destructor
      delete[] p;
   }

   void operator=(arreglo_dinamico& v) {     // asignación por copia
      delete[] p;
      cap = v.tam;
      tam = v.tam;
      p = new int[cap];
      for (int i = 0; i < tam; ++i) {
         p[i] = v.p[i];
      }
   }

   int size( ) {
      return tam;
   }

   int& operator[](int i) {
      return p[i];
   }

   void agrega(int v) {
      if (tam == cap) {
         int* q = new int[2 * cap];
         for (int i = 0; i < tam; ++i) {
            q[i] = p[i];
         }
         delete[] p;
         p = q;
         cap *= 2;
      }

      p[tam] = v;
      tam += 1;
   }

   void quita_ultimo( ) {
      tam -= 1;
   }
};

int main( ) {
   arreglo_dinamico a;      // a vale { }
   a.agrega(5);             // a vale { 5 }
   a.agrega(7);             // a vale { 5, 7 }
   a.agrega(8);             // a vale { 5, 7, 8 }
   a.agrega(6);             // a vale { 5, 7, 8, 6 }
   a.quita_ultimo( );       // a vale { 5, 7, 8 }

   arreglo_dinamico b = a;  // b vale { 5, 7, 8 }
   a.quita_ultimo( );       // a vale { 5, 7 }

   arreglo_dinamico c;      // c vale { }
   c.agrega(9);             // c vale { 9 }
   c = a;                   // c vale { 5, 7 }
   a.quita_ultimo( );       // a vale { 5 }

   std::cout << "a: ";
   for (int i = 0; i < a.size( ); ++i) {
      std::cout << a[i] << " ";
   }
   std::cout << "\n";

   std::cout << "b: ";
   for (int i = 0; i < b.size( ); ++i) {
      std::cout << b[i] << " ";
   }
   std::cout << "\n";

   std::cout << "c: ";
   for (int i = 0; i < c.size( ); ++i) {
      std::cout << c[i] << " ";
   }
   std::cout << "\n";
}
