Клас контейнера / бібліотека для C [закрито]


78

Хтось знає про будь-які бібліотеки контейнерів C? Я шукаю щось, що дає стандартні реалізації пов'язаних списків, масивів, хеш-таблиць тощо, приблизно так само, як це робить C ++ STL. Основними проблемами є:

  1. Клієнтський код повинен мати можливість створювати контейнери для декількох різних типів даних без зміни бібліотеки.
  2. Інтерфейс для створення та використання контейнерів повинен бути інтуїтивно зрозумілим.

Відповіді:


24

Я щойно натрапив на SGLIB, шукаючи реалізацію C контейнера map / dictionary. На жаль, карти немає, але вона, здається, включає контейнери, про які ви запитували. Я не уявляю, наскільки це добре.

http://sglib.sourceforge.net .


3
Станом на 2013-07 роки, проект sourceforge, здається, мертвий. Я помітив, що в документах ніде не згадується слово "помилка" і не згадується про обробку помилок. Бібліотека контейнерів C Джейкоба Навії набагато, набагато краща в цій галузі, і вона має ~ 370 сторінок офіційної документації - але, на жаль, його ccl не є відкритим кодом.
Alex North-Keys,

Станом на травень 2014 року посилання не померло.
010110110101

1
Насправді, бібліотека контейнерів C Джейкоба Навії з відкритим кодом - див. Code.google.com/p/ccl. Я надіслав автору електронний лист і підтвердив, що "некомерційні" обмеження, згадані в інших місцях на його сайті, не стосуються CCL.
шукач зірок

11

Sglib - відмінна бібліотека загальних структур даних. На даний момент бібліотека забезпечує загальну реалізацію для:

  • сортування масивів
  • пов'язані списки
  • відсортовані пов'язані списки
  • подвійні зв’язані списки
  • червоно-чорні дерева
  • хешовані контейнери

Це дуже швидко. Швидше, що гліб. Він натхненний стандартною бібліотекою шаблонів. Завантажте тут

Інше рішення - програмне забезпечення « Привабливий хаос» . Бібліотека макросів C:
kbtree.h: ефективна бібліотека B-дерева в C.
khash.h: швидка та легка бібліотека хеш-таблиць у C.
kvec.h: простий векторний контейнер у C.

Kulesh Shanmugasundaram представляє загальний список пов'язаних ядер Linux та загальну хеш-таблицю, заснований на списку пов'язаних ядром Linux.

Програмне забезпечення Sglib та Attractive Chaos та Список пов’язаних ядер Linux - це бібліотеки макросів C. Використання void*для реалізації загальних контейнерів на мові C може бути неефективним. Макроси C імітують шаблони C ++ і настільки ж ефективні, як шаблон C ++.


2
Ви сказали: "Використання void * для реалізації загальних контейнерів у C може бути неефективним". - Чи можете ви пояснити, чому ви так думаєте?
Арун

@Arun Я думаю, це пов'язано з поганою пам'яттю. Ви можете мати void *приємне прокладання даних всередині деяких структур даних, але загальний , швидше за все, вказуватиме на весь адресний простір вашого процесу.
val каже Reinstate Monica

10

Чак Сокольник має пристойну хеш-бібліотеку, написану на мові C, яка включає інтерфейс C ++, натисніть на hashlib.zip на веб-сторінці, щоб завантажити.

Бен Пфафф має дуже гарну та надзвичайно добре задокументовану двійкову та збалансовану бібліотеку дерев, GNU libavl , яка реалізує більшість основних деревних структур, включаючи бінарні дерева пошуку, дерева AVL, червоно-чорні дерева та різьбові версії кожного з них.

libavl ліцензований згідно LGPL (станом на версію 2.0.3), hashlib - GPL.

Я не впевнений, що ви шукаєте, що стосується масивів та пов'язаних списків, оскільки перший підтримується безпосередньо мовою, а другий, як правило, досить тривіальний для реалізації, не вимагаючи бібліотеки.


1
Нещодавно я подивився хеш-таблицю Чака Фальконера, і вона цілком непогана. Єдина моя скарга полягає в тому, що незрозуміло, чи можна використовувати його в комерційному проекті. Він просить вас зв’язатися з ним за дозволом.
Нік Ван Брант

2
@Nick: Насправді немає нічого незрозумілого щодо дозволів на використання коду hashlib Falconer: він чітко ліцензований відповідно до GPL. Якщо ваш комерційний код відповідає умовам GPL (в основному, якщо ваш комерційний код також має ліцензію GPL), зв’язуватися з ним не потрібно. Якщо вам потрібні інші умови ліцензування, крім GPL, він може зв’язатися з вами щодо цього.
Michael Burr

2
@Michael Burr: GPL та LGPL, коротше кажучи, не можна використовувати в комерційному середовищі чи справжньому середовищі з відкритим кодом. Я б запропонував також тим, хто розглядає це як рішення шукати в іншому місці.

1
@Zenikoder: це вірно для багатьох, можливо навіть більшості комерційних проектів. Але інформація про те, чи можна використовувати код GPL чи LGPL у комерційному проекті, повністю залежить від вимог комерційного проекту. Я працював у кількох місцях, де добре було використовувати код LGPL, якщо він використовувався лише у формі DLL.
Michael Burr

7

Як щодо ccl? Це бібліотека контейнерів для C. Можливо, вона вам найбільше підходить. Ви можете переглянути https://code.google.com/p/ccl/ . Насолоджуйся цим.


2
Цю відповідь ще не дав @navicore. Він говорив про іншу бібліотеку з різною в декілька пікселів абревіатурою.
Alex North-Keys,

5

Я використовую бібліотеку, яку виростив із книги "Інтерфейс та реалізації" Хенсона. Його джерело можна завантажити за адресою

веб-сайт книги cii

Все є абстрактним типом даних. Є список, набір, таблиця (карта).


4
Врешті-решт, ви можете виявити, що код знаходиться на сайті code.google.com/p/cii і ліцензується під надзвичайно гнучкою ліцензією MIT.
Джонатан Леффлер,

Здається, ця бібліотека не пропонує дрібну обробку помилок у стилі С, а скоріше грубий підхід винятків із setjmp / longjmp. Це не хороший кандидат для коду, де безвідмовна робота є критичною.
Алекс Норт-Кіз

2

#include "queue.h" отримати доступ до реалізацій однопов'язаних списків, окремо пов'язаних черг хвостів, списків та черг хвостів.

Я виявив, що загальний кеш для зберігання довільних об'єктів у пам'яті від DJ Bernstein ( http://cr.yp.to/djbdns.html ) є одночасно чистим, простим і надзвичайно швидким. Знайдіть cache.h та cache.c у djdns tarball.


2

Деякі з них, про які я чув (але ніколи не використовував), є

  • Гліб
  • Бібліотека стандартних функцій iMatix
  • різні елементи із заголовків ядра Linux (наприклад, список)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.