Containerklasse / Bibliothek für C [geschlossen]

78

Kennt jemand C-Container-Bibliotheken? Ich bin auf der Suche nach etwas, das Standardimplementierungen von verknüpften Listen, Arrays, Hash-Tabellen usw. bietet, ähnlich wie die C ++ STL. Hauptanliegen sind:

  1. Client-Code sollte in der Lage sein, Container für mehrere verschiedene Datentypen zu erstellen, ohne die Bibliothek zu ändern.
  2. Die Oberfläche zum Erstellen und Verwenden der Container sollte intuitiv sein.
Howard May
quelle

Antworten:

24

Ich bin gerade auf SGLIB gestoßen, als ich nach einer C-Implementierung eines Karten- / Wörterbuchcontainers gesucht habe. Leider keine Karte, aber sie scheint die Container zu enthalten, nach denen Sie gefragt haben. Ich habe keine Ahnung, wie gut es ist.

http://sglib.sourceforge.net .

Nick Van Brunt
quelle
3
Ab 2013-07 scheint dieses Sourceforge-Projekt tot zu sein. Mir ist aufgefallen, dass in den Dokumenten weder das Wort "Fehler" noch die Fehlerbehandlung erwähnt wurden. Die C-Container-Bibliothek von Jacob Navia ist in diesem Bereich viel, viel besser und verfügt über ~ 370 Seiten formale Dokumentation - aber leider ist seine CCL nicht Open Source.
Alex North-Keys
Ab Mai 2014 ist der Link nicht tot.
010110110101
1
Tatsächlich ist die C-Container-Bibliothek von Jacob Navia Open Source - siehe code.google.com/p/ccl - Ich habe dem Autor eine E-Mail gesendet und bestätigt, dass die an anderer Stelle auf seiner Website genannten "nichtkommerziellen" Einschränkungen nicht für CCL gelten.
Sternensucher
11

Sglib ist eine ausgezeichnete Bibliothek für generische Datenstrukturen. Die Bibliothek bietet derzeit eine generische Implementierung für:

  • Arrays sortieren
  • verknüpfte Listen
  • sortierte verknüpfte Listen
  • doppelt verknüpfte Listen
  • rot-schwarze Bäume
  • gehashte Container

Es ist sehr schnell. Schneller das Glib. Es ist von der Standardvorlagenbibliothek inspiriert. Hier herunterladen

Eine andere Lösung ist Attractive Chaos Sotware . C-
Makrobibliothek : kbtree.h: Effiziente B-Baum-Bibliothek in C.
khash.h: Schnelle und leichte Hash-Tabellenbibliothek in C.
kvec.h: Einfacher Vektorcontainer in C.

Kulesh Shanmugasundaram präsentiert die generische Linux Kernel Linked List und eine generische Hash-Tabelle, die auf der Linux Kernel Linked List basiert.

Sglib und Attractive Chaos Sotware sowie Linux Kernel Linked List sind C-Makrobibliotheken. Die Verwendung void*zum Implementieren generischer Container in C kann ineffizient sein. C-Makros ahmen C ++ - Vorlagen nach und sind so effizient wie eine C ++ - Vorlage.

Lear
quelle
2
Sie sagten: "Die Verwendung von void * zur Implementierung generischer Container in C ist möglicherweise ineffizient." - Können Sie bitte erklären, warum Sie so denken?
Arun
@Arun Ich denke, es hat mit schlechter Speicherlokalität zu tun. Sie können Daten gut in einigen Datenstrukturen ablegen, aber generische Daten void *verweisen wahrscheinlich auf den gesamten Adressraum Ihres Prozesses.
Val sagt Reinstate Monica
10

Chuck Falconer hat eine anständige Hash-Bibliothek in C geschrieben, die eine C ++ - Schnittstelle enthält. Klicken Sie auf der Webseite auf hashlib.zip, um sie herunterzuladen.

Ben Pfaff hat eine sehr schöne und äußerst gut dokumentierte binäre und ausgeglichene Baumbibliothek , GNU libavl , die die meisten wichtigen Baumstrukturen implementiert, einschließlich binärer Suchbäume, AVL-Bäume, rot-schwarzer Bäume und Thread-Versionen von jedem.

libavl ist unter der LGPL (ab Version 2.0.3) lizenziert, hashlib ist GPL.

Ich bin mir nicht sicher, wonach Sie suchen, was Arrays und verknüpfte Listen betrifft, da erstere direkt von der Sprache unterstützt werden und letztere im Allgemeinen trivial genug sind, um ohne Garantie für eine Bibliothek implementiert zu werden.

Robert Gamble
quelle
1
Ich habe mir kürzlich Chuck Falconers Hash-Tabelle angesehen und es ist ziemlich gut. Meine einzige Beschwerde ist, dass unklar ist, ob man es in einem kommerziellen Projekt verwenden kann. Er bittet Sie, ihn um Erlaubnis zu bitten.
Nick Van Brunt
2
@Nick: Es gibt wirklich nichts Unklares über die Berechtigungen für die Verwendung von Falconers Hashlib-Code: Er ist eindeutig unter der GPL lizenziert. Wenn Ihr Handelscode mit den GPL-Bedingungen übereinstimmt (im Grunde genommen, wenn Ihr Handelscode auch GPL-lizenziert ist), müssen Sie ihn nicht kontaktieren. Wenn Sie andere Lizenzbedingungen als die GPL wünschen, ist er offen dafür, darüber kontaktiert zu werden.
Michael Burr
2
@ Michael Burr: GPL und LGPL können in einer kommerziellen Umgebung oder einer echten Open Source-Umgebung nicht verwendet werden. Ich würde auch denjenigen vorschlagen, die dies als Lösung betrachten, um woanders zu suchen.
1
@ Zenikoder: Das gilt für viele, vielleicht sogar die meisten kommerziellen Projekte. Die Einzelheiten, ob GPL- oder LGPL-Code in einem kommerziellen Projekt verwendet werden kann oder nicht, hängen jedoch vollständig von den Anforderungen des kommerziellen Projekts ab. Ich habe an einigen Stellen gearbeitet, an denen LGPL-Code in Ordnung war, solange er nur in DLL-Form verwendet wurde.
Michael Burr
7

Wie wäre es mit ccl? Dies ist eine Containerbibliothek für C. Vielleicht passt sie am besten zu Ihnen. Sie können https://code.google.com/p/ccl/ sehen . Genieß es.

pwrlove
quelle
2
Diese Antwort wurde noch nicht von @navicore gegeben. Er sprach von einer anderen Bibliothek mit einem um einige Pixel unterschiedlichen Akronym.
Alex North-Keys
5

Ich habe eine Bibliothek verwendet, die ich aus Hansons Buch "C Interface and Implementations" erweitert habe. Seine Quelle kann unter heruntergeladen werden

cii Buchwebsite

Alles ist ein abstrakter Datentyp. Es gibt Liste, Set, Tabelle (Karte).

navicore
quelle
4
Schließlich können Sie feststellen, dass sich der Code unter code.google.com/p/cii befindet und unter der äußerst flexiblen MIT-Lizenz lizenziert ist.
Jonathan Leffler
Diese Bibliothek scheint keine feinkörnige Fehlerbehandlung im C-Stil zu bieten, sondern den groben Ansatz von Ausnahmen mit setjmp / longjmp. Es ist kein guter Kandidat für Code, bei dem die Verfügbarkeit entscheidend ist.
Alex North-Keys
2

#include "queue.h" Zugriff auf die Implementierungen von einfach verknüpften Listen, einfach verknüpften Endwarteschlangen, Listen und Endwarteschlangen.

Ich fand einen generischen Cache zum Speichern beliebiger Objekte im Speicher von DJ Bernstein ( http://cr.yp.to/djbdns.html ) sowohl sauber als auch einfach und superschnell. Suchen Sie in djdns tarball nach cache.h und cache.c.

user105991
quelle
2

Einige von denen, von denen ich gehört habe (aber nie benutzt habe), sind

  • Glib
  • iMatix Standard-Funktionsbibliothek
  • unterschiedliche Elemente aus den Linux-Kernel-Headern (zB Liste)
Sandeep
quelle