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.
[x] los elementos se guardan contiguos, no hay necesidad de administrar una reserva aparte para los mismos (como en lista)
[x] 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);
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
yfront
. 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.Ejemplo de uso: