martes, 16 de febrero de 2010

Tamaño de un vector en c sin usar variables extra

Esta tarde, me acorde de que alguien me dijo que en pascal la primera componente de los vectores era su tamaño, no se si es cierto, pero en c, esto no ocurre y es necesario tener otra variable aparte para "recordar" cual es el tamaño de cierto vector.
Pensando un poco se me ocurrió la grandisima idea, por lo menos para mi ;) , de poder deshacernos de la variable extra sin olvidarnos del tamaño de un vector, es decir, donde antes teniamos las variables *vector y tam, ahora solo nos haría falta *vector.
No se si se le ocurrio a alguien antes, busque un poco que parece que nadie usa este metodo, asi que o lo acabo de inventar o no se usa por que realmente es muy malo, yo creo que es genial (siempre que se trabaje con numeros enteros), es 100% compatible con el método "clásico" y tiene muchísimas ventajas.

Como funciona

Muy fácil, lo que se hace con este método es guardar el tamaño del vector en el propio vector. Se reserva memoria también para el tamaño y se hace apuntar al puntero a la posición siguiente de memoria, quedando el tamaño en la posición -1, y las posiciones de 0 en adelante como un vector normal y corriente.

Ventajas

Como nos ahorramos una variable, hace mas fácil escribir y entender el código y sobretodo creo que viene muy bien en los bucles o en las funciones, donde nos ahoramos un parámetro.
Y todo esto tan solo añadiendo un par de lineas.

Inconveniente

Solo vale para vectores con números enteros (int).

Como se hace

  • Añade #define SIZE -1 al principio de tu código.
  • A la hora de reservar memoria para el vector súmale 1: int *V = new int [i+1];
  • Después de reservar la memoria añade (++V)[SIZE] = i; con esta linea lo que hacemos es que el vector apunte a la primera componente y guardar el tamaño del vector en la posicion SIZE o -1.
  • Y ya esta, ahora acuérdate de usar V[SIZE] .

Ejemplo

#include <iostream>
using namespace std;

#define SIZE -1

int main(){
  int i;

  cout << "Introduce el tamaño del vector" << endl;
  cin >> i;

  int *V = new int [i+1];

  if(!V){
    cerr << "No se puede reservar el espacio" << endl;
    return 1;
  }

  (++V)[SIZE] = i;

  cout << "Introduzce el vector" << endl;
  for(i = 0; i < V[SIZE]; i++)
      cin >> V[i];

  cout << "Mostrar el vector" << endl;
  for(i = 0; i < V[SIZE]; i++)
    cout << V[i] << " ";

  delete [] V;

  return 0;
}
Comparte o puntua esta publicación ▼

1 comentarios:

Alex dijo...

Hay que decirlo tio... Voy a usar este metodo en programacion en mi proximo trabajo jaja

Ayer los lei todos pero estaba en el iphone y no pude dejarte un comentario, pero me encanta el blog en serio

Publicar un comentario