QLIBC в настоящее время является одним из наиболее функционально полных, публично лицензированных библиотек C/C ++. Цель проекта QLIBC - предоставить простую и мощную библиотеку C/C ++ общего назначения, которая включает в себя все виды контейнеров и общие библиотечные процедуры. Он обеспечивает готовый набор общих контейнерных API с последовательным видом API.
QLIBC опубликована по лицензии BSD 2 оказания, известной как упрощенная лицензия BSD. Пожалуйста, обратитесь к лицензионному документу, включенному в пакет для получения более подробной информации.
QLIBC Core API Ссылка
QLIBC Extension API Справочник
| Характеристики | Стол дерева | Хэш -таблица | Статическая хеш -таблица | Списки таблицы |
|---|---|---|---|---|
| Структура данных | Бинарное дерево | Индекс слота | Блок -массив | Связанный список |
| Сложность поиска | O (log n) | O (1) / o (n) | O (1) / o (n) | На) |
| Вставить сложность | O (log n) | O (1) / o (n) | O (1) / o (n) | O (1) |
| Удалить сложность | O (log n) | O (1) / o (n) | O (1) / o (n) | На) |
| Сложность пространства | На) | На) | - | На) |
| Распределение пространства | Динамика | Динамика | Предварительное распределение | Динамика |
| Ключ хранится сортирован | Да | Нет | Нет | Да (опция) |
| Пользовательский компаратор | Поддерживается | - | - | Поддерживается |
| Дублированные ключи | Нет | Нет | Нет | Да (опция) |
| Ключ хранится | Нет | Нет | Да | Нет |
| Поиск ближайшего ключа | Да | Нет | Нет | Нет |
| Поддержка итератора | Да | Да | Да | Да |
| Итератор посещать заказ | Мин -> Макс | случайный | случайный | Вставить заказ |
| Опция защиты потока | Поддерживается | Поднятый | Пользователь | Поддерживается |
| Может использовать общий мем | Нет | Нет | Да | Нет |
Все контейнерные API имеют последовательный вид и ощущение. В основном он обеспечивает функцию создателя, которая обычно возвращает указатель в структуру контейнера. Кроме того, все функции, связанные с контейнером, могут быть доступны через указатели функций внутри контейнера или API с прямым доступом традиционного стиля. Для примера,
Таким образом, независимо от того, какой контейнер вы используете, вы можете просто поместить элементы в список с container->put(container, ...) или вы можете позвонить им, используя прямой API, например Qtreetbl_pub (контейнер, ...).
Примеры ниже иллюстрируют, как это выглядит.
// 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);
Вот идентичная реализация с контейнером из связанного списка. Вы можете заметить, что нет никаких изменений кода вообще, за исключением 1 строки в создании таблицы. Вот почему QLIBC инкапсулирует соответствующие указатели функций внутри объекта контейнера.
// 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);
Мы ищем людей, которые хотят работать вместе, чтобы развить и улучшить QLIBC. В настоящее время у нас есть высокие требования на следующих областях.
Следующие люди помогли с предложениями, идеями, кодом или исправлением ошибок: (в алфавитном порядке по имени)
Если мы забыли или написали ваше имя, пожалуйста, сообщите нам об этом.