¿Cómo implementar nuestra propia Clase Vector en C++?

La tarea dada es implementar una clase en C++ que se comporte como la clase Vector .
Los vectores son lo mismo que las arrays dinámicas con la capacidad de cambiar su tamaño automáticamente cuando se inserta o elimina un elemento, y el contenedor maneja automáticamente su almacenamiento. Los elementos vectoriales se colocan en almacenamiento contiguo para que se pueda acceder a ellos y recorrerlos mediante iteradores. En los vectores, los datos se insertan al final. Insertar al final toma un tiempo diferencial, ya que a veces puede ser necesario extender la array. Eliminar el último elemento lleva solo un tiempo constante porque no se cambia el tamaño. Insertar y borrar al principio o en el medio es lineal en el tiempo. 

También podemos hacer que la clase de vector sea genérica usando plantillas.
Ciertas funciones asociadas al Vector que implementaremos son: 

  • void push(int data) : Esta función toma un elemento y lo inserta en el último. La complejidad del tiempo amortizado es O(1).
  • void push(int data, int index): Inserta datos en el índice especificado. La complejidad del tiempo es O(1).
  • int get(int index): Se utiliza para obtener el elemento en el índice especificado. La complejidad del tiempo es O(1).
  • void pop(): Elimina el último elemento. La complejidad del tiempo es O(1).
  • int size(): Devuelve el tamaño del vector, es decir, el número de elementos en el vector. La complejidad del tiempo es O(1).
  • int getcapacity(): Devuelve la capacidad del vector. La complejidad del tiempo es O(1).
  • void print(): se utiliza para imprimir elementos de array. La complejidad del tiempo es O(N), donde N es el tamaño del vector.

A continuación se muestra la implementación de nuestra propia clase Vector. 

C++

// Self implementation of
// the Vector Class in C++
 
#include <bits/stdc++.h>
using namespace std;
template <typename T> class vectorClass {
 
    // arr is the integer pointer
    // which stores the address of our vector
    T* arr;
 
    // capacity is the total storage
    // capacity of the vector
    int capacity;
 
    // current is the number of elements
    // currently present in the vector
    int current;
 
public:
    // Default constructor to initialise
    // an initial capacity of 1 element and
    // allocating storage using dynamic allocation
    vectorClass()
    {
        arr = new T[1];
        capacity = 1;
        current = 0;
    }
       //destructor to deallocate storage allocated by dynamic allocation
       //to prevent memory leak
      ~ vectorClass()
    {
          delete [] arr;
    }
 
    // Function to add an element at the last
    void push(T data)
    {
 
        // if the number of elements is equal to the
        // capacity, that means we don't have space to
        // accommodate more elements. We need to double the
        // capacity
        if (current == capacity) {
            T* temp = new T[2 * capacity];
 
            // copying old array elements to new array
            for (int i = 0; i < capacity; i++) {
                temp[i] = arr[i];
            }
 
            // deleting previous array
            delete[] arr;
            capacity *= 2;
            arr = temp;
        }
 
        // Inserting data
        arr[current] = data;
        current++;
    }
 
    // function to add element at any index
    void push(T data, int index)
    {
 
        // if index is equal to capacity then this
        // function is same as push defined above
        if (index == capacity)
            push(data);
        else
            arr[index] = data;
    }
 
    // function to extract element at any index
    T get(int index)
    {
 
        // if index is within the range
        if (index < current)
            return arr[index];
    }
 
    // function to delete last element
    void pop() { current--; }
 
    // function to get size of the vector
    int size() { return current; }
 
    // function to get capacity of the vector
    int getcapacity() { return capacity; }
 
    // function to print array elements
    void print()
    {
        for (int i = 0; i < current; i++) {
            cout << arr[i] << " ";
        }
        cout << endl;
    }
};
 
// Driver code
int main()
{
    vectorClass<int> v;
    vectorClass<char> v1;
    v.push(10);
    v.push(20);
    v.push(30);
    v.push(40);
    v.push(50);
    v1.push(71);
    v1.push(72);
    v1.push(73);
    v1.push(74);
 
    cout << "Vector size : " << v.size() << endl;
    cout << "Vector capacity : " << v.getcapacity() << endl;
 
    cout << "Vector elements : ";
    v.print();
 
    v.push(100, 1);
 
    cout << "\nAfter updating 1st index" << endl;
 
    cout << "Vector elements of type int : " << endl;
    v.print();
    // This was possible because we used templates
    cout << "Vector elements of type char : " << endl;
    v1.print();
    cout << "Element at 1st index of type int: " << v.get(1)
         << endl;
    cout << "Element at 1st index of type char: "
         << v1.get(1) << endl;
 
    v.pop();
    v1.pop();
 
    cout << "\nAfter deleting last element" << endl;
 
    cout << "Vector size of type int: " << v.size() << endl;
    cout << "Vector size of type char: " << v1.size()
         << endl;
    cout << "Vector capacity of type int : "
         << v.getcapacity() << endl;
    cout << "Vector capacity of type char : "
         << v1.getcapacity() << endl;
 
    cout << "Vector elements of type int: ";
    v.print();
    cout << "Vector elements of type char: ";
    v1.print();
 
    return 0;
}
Producción

Vector size : 5
Vector capacity : 8
Vector elements : 10 20 30 40 50 

After updating 1st index
Vector elements of type int : 
10 100 30 40 50 
Vector elements of type char : 
G H I J 
Element at 1st index of type int: 100
Element at 1st index of type char: H

After deleting last element
Vector size of type int: 4
Vector size of type char: 3
Vector capacity of type int : 8
Vector capacity of type char : 4
Vector elements of type int: 10 100 30 40 
Vector elements of type char: G H I 

Publicación traducida automáticamente

Artículo escrito por mv15 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *