Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TAD Vector (aka array redimensionable) #115

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

ariel-
Copy link

@ariel- ariel- commented Aug 16, 2019

Buenas! Utilicé este tipo cuando hacía el TP y creo que estaría bien para la commons library.

El vector utiliza memoria contigua del heap, en lugar de bloques enlazados como la lista; aprovechando mejor así el concepto de localidad espacial en el que se basan las memorias caché. Para amortizar la operación de inserción, que en lista es O(1), el vector se redimensiona al doble de su tamaño cuando se termina su capacidad, logrando un tiempo promedio de orden logarítmico.

La abstracción utilizada (ya que C carece de referencias) es de "puntero a tipo". Lo someti a la batería de tests que copié de lista y modifiqué un poco para testear las otras funciones.

La interfaz está basada en el tipo vector de c++, por lo que podremos encontrar cosas como push_back y front. Además y para mantenerme fiel a la interfaz original, el destructor de elemento se pasa como parámetro del constructor; en lugar de tener que pasarlo para todas las funciones que borren elementos.

  • los elementos se guardan contiguos, no hay necesidad de administrar una reserva aparte para los mismos (como en lista)
  • incluye un shortcut para crear vectores de strings, con memoria administrada por el vector!, (en un futuro se podria utilizar para reescribir ie. string_split para que devuelva un vector con las cadenas token)

Ejemplo de uso:

// vector of char*'s
vector v = VECTOR_OF_STRINGS_INITIALIZER;
char* string = strdup("Hola");

// need to pass "reference" to char*, so we use addressof operator
vector_push_back(&v, &string);

string = strdup("Chau");
vector_push_back(&v, &string);

// vector uses "pointer to type" (char*)
void _print_strings(char** elem)
{
    printf("%s\n", *elem);
}

vector_iterate(&v, (VectorClosureFn) _print_strings);

// also frees memory used by strings!
vector_destruct(&v);

@gastonprieto
Copy link
Contributor

gastonprieto commented Aug 18, 2019

Copado! lo vamos a estar mirando. Justo teniamos un issue de eso hace un monton.

Relacionado con #9

@ariel-
Copy link
Author

ariel- commented Sep 24, 2019

Buenas, ¿pudieron revisar ésto?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants