O QLIBC é atualmente uma das bibliotecas C/C ++ mais funcionalmente completas e licenciadas publicamente. O objetivo do projeto QLIBC é fornecer uma biblioteca C/C ++ de uso geral simples e poderoso que inclua todos os tipos de contêineres e rotinas gerais de biblioteca. Ele fornece um conjunto pronto de APIs de contêiner comuns com uma aparência de API consistente.
O QLIBC é publicado sob a licença BSD de 2 cláusulas, conhecida como licença simplificada de BSD. Consulte o documento de licença incluído no pacote para obter mais detalhes.
referência da API do núcleo QLIBC
referência da API de extensão QLIBC
| Características | Mesa de árvore | Tabela de hash | Tabela de hash estático | Tabela de listas |
|---|---|---|---|---|
| Estrutura de dados | Árvore binária | Índice de caça -níqueis | Matriz de bloco | Lista vinculada |
| Complexidade de pesquisa | O (log n) | O (1) / o (n) | O (1) / o (n) | Sobre) |
| Insira a complexidade | O (log n) | O (1) / o (n) | O (1) / o (n) | O (1) |
| Excluir complexidade | O (log n) | O (1) / o (n) | O (1) / o (n) | Sobre) |
| Complexidade espacial | Sobre) | Sobre) | - | Sobre) |
| Alocação de espaço | Dinâmico | Dinâmico | Pré-alocação | Dinâmico |
| Teclas armazenadas classificadas | Sim | Não | Não | Sim (opção) |
| Comparador de usuário | Suportado | - | - | Suportado |
| Chaves duplicadas | Não | Não | Não | Sim (opção) |
| Chave armazenada digerida | Não | Não | Sim | Não |
| Pesquise a chave mais próxima | Sim | Não | Não | Não |
| Suporte do iterador | Sim | Sim | Sim | Sim |
| Pedido de visita ao iterador | Min -> máx | aleatório | aleatório | Insira o pedido |
| Opção segura para threads | Suportado | Suportado | Usuário | Suportado |
| Pode usar o MEM compartilhado | Não | Não | Sim | Não |
Todas as APIs de contêiner têm uma aparência consistente. Ele basicamente fornece uma função de criador que geralmente retorna um ponteiro para uma estrutura de contêiner. Além disso, todas as funções relacionadas ao contêiner podem ser acessadas através de ponteiros de função dentro do contêiner ou APIs de acesso direto de estilo tradicional. Por exemplo,
Portanto, independentemente do contêiner que você usa, você pode simplesmente colocar elementos em uma lista com container->put(container, ...) ou você pode chamá-los usando a API direta como o qTreetbl_pub (contêiner, ...).
Um exemplo abaixo ilustra como é.
// 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);
Aqui está uma implementação idêntica com um contêiner de tabela de lista vinculada. Você pode notar que não há nenhuma alteração de código, exceto 1 linha na criação da tabela. É por isso que o QLIBC encapsula os ponteiros de função correspondentes dentro do objeto de contêiner.
// 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 procurando pessoas que desejam trabalhar juntas para desenvolver e melhorar o QLIBC. Atualmente, temos grandes demandas nas seguintes áreas.
As seguintes pessoas ajudaram com sugestões, idéias, codificar ou consertar bugs: (em ordem alfabética pelo primeiro nome)
Se esquecemos ou desperdiçamos seu nome, informe -nos.