sisoputnfrba / so-commons-library

TADs de uso comun en aplicaciones desarrolladas en C
http://sisoputnfrba.github.io/so-commons-library/
GNU General Public License v3.0
106 stars 174 forks source link

TAD Vector (aka array redimensionable) #115

Open ariel- opened 5 years ago

ariel- commented 5 years ago

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.

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 commented 5 years ago

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

Relacionado con #9

ariel- commented 5 years ago

Buenas, ¿pudieron revisar ésto?