QLIBC es actualmente una de las bibliotecas C/C ++ de licencia pública más funcionalmente y licenciada. El objetivo del proyecto QLIBC es proporcionar una biblioteca C/C ++ de propósito general simple y potente que incluya todo tipo de contenedores y rutinas de biblioteca general. Proporciona un conjunto listo para contenedores comunes con un aspecto API consistente.
QLIBC se publica bajo la licencia BSD de 2 cláusula conocida como licencia BSD simplificada. Consulte el documento de licencia incluido en el paquete para obtener más detalles.
referencia de API de Core QLIBC
referencia de API de extensión QLIBC
| Características | Mesa de árboles | Mesa de hash | Mesa de hash estático | Tabla de lista |
|---|---|---|---|---|
| Estructura de datos | Árbol binario | Índice de ranura | Matriz de bloques | Lista vinculada |
| Complejidad de búsqueda | O (log n) | O (1) / o (n) | O (1) / o (n) | En) |
| Insertar complejidad | O (log n) | O (1) / o (n) | O (1) / o (n) | O (1) |
| Eliminar la complejidad | O (log n) | O (1) / o (n) | O (1) / o (n) | En) |
| Complejidad espacial | En) | En) | - | En) |
| Asignación de espacio | Dinámica | Dinámica | Pre-asignación | Dinámica |
| Llave almacenada ordenada | Sí | No | No | Sí (opción) |
| Comparador de usuarios | Compatible | - | - | Compatible |
| Teclas duplicadas | No | No | No | Sí (opción) |
| Llave almacenada digerida | No | No | Sí | No |
| Buscar la clave más cercana | Sí | No | No | No |
| Soporte iterador | Sí | Sí | Sí | Sí |
| Orden de visita de iterador | min -> max | aleatorio | aleatorio | orden de inserción |
| Opción segura | Compatible | Subportado | Usuario | Compatible |
| Puede usar MEM compartido | No | No | Sí | No |
Todas las API de contenedores tienen una apariencia y sensación consistentes. Básicamente proporciona una función de creador que generalmente devuelve un puntero a una estructura de contenedor. Además, se puede acceder a todas las funciones relacionadas con el contenedor a través de punteros de funciones dentro del contenedor o API de acceso directo de estilo tradicional. Para un ejemplo,
Por lo tanto, independientemente del contenedor que use, simplemente puede poner elementos en una lista con container->put(container, ...) o puede llamarlos usando una API directa como qtreetbl_pub (contenedor, ...).
Un ejemplo a continuación ilustra cómo se ve.
// create a hash-table.
qhashtbl_t *tbl = qhashtbl(0, QHASHTBL_THREADSAFE);
// add an element which key name is "score".
int x = 12345;
tbl->put(tbl, "score", &x, sizeof(int));
// get the value of the element.
int *px = tbl->get(tbl, "score", NULL, true);
if(px != NULL) {
printf("%dn", *px);
free(px);
}
// release table
tbl->free(tbl);
Aquí hay una implementación idéntica con un contenedor de mesa de lista vinculada. Puede notar que no hay ningún cambio de código, excepto 1 línea en la creación de la tabla. Esta es la razón por la cual QLIBC encapsula los punteros de la función correspondiente dentro del objeto contenedor.
// create a linked-list-table. THE ONLY LINE YOU NEED TO CHANGE.
qlisttbl_t *tbl = qlisttbl(QLISTTBL_THREADSAFE);
// add an element which key name is "score".
int x = 12345;
tbl->put(tbl, "score", &x, sizeof(int));
// get the value of the element.
int *px = tbl->get(tbl, "score", NULL, true);
if(px != NULL) {
printf("%dn", *px);
free(px);
}
// release table
tbl->free(tbl);
Estamos buscando personas que quieran trabajar juntas para desarrollar y mejorar QLIBC. Actualmente, tenemos altas demandas sobre las siguientes áreas.
Las siguientes personas han ayudado con sugerencias, ideas, código o corrección de errores: (en orden alfabético por nombre)
Si hemos olvidado o mal escrito su nombre, háganoslo saber.