Containerklasse/Bibliothek für C [closed]

Lesezeit: 5 Minuten

Benutzeravatar von Howard May
Howard Mai

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

  1. Clientcode 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.

Ich bin gerade auf SGLIB gestoßen, als ich nach einer C-Implementierung eines Karten-/Wörterbuch-Containers suchte. 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.

  • Ab 2013-07 scheint dieses Sourceforge-Projekt tot zu sein. Mir ist aufgefallen, dass in den Dokumenten weder das Wort “Fehler” noch eine Fehlerbehandlung erwähnt wurden. Die C-Container-Bibliothek von Jacob Navia ist in diesem Bereich viel, viel besser und hat ~370 Seiten formelle Dokumentation – aber leider ist seine ccl nicht Open Source.

    – Alex North-Keys

    4. Juli 2013 um 14:57 Uhr

  • Ab Mai 2014 ist der Link nicht tot.

    – 101010

    10. Mai 2014 um 0:35 Uhr

  • 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 geschickt und bestätigt, dass die an anderer Stelle auf seiner Website erwähnten “nicht-kommerziellen” Einschränkungen nicht für CCL gelten.

    – Sternensucher

    4. April 2015 um 17:02 Uhr

Benutzeravatar von Lear
Lear

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

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

Es ist sehr schnell. Schneller, dass glib. Es ist von der Standard-Vorlagenbibliothek inspiriert. Hier herunterladen

Eine andere Lösung ist Attraktive Chaos-Software. C-Makro-Bibliothek:
kbtree.h: effiziente B-Tree-Bibliothek in C.
khash.h: schnelle und leichtgewichtige 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 Attraktive Chaos-Software sowie Linux Kernel Linked List sind C-Makrobibliotheken. Verwenden void* generische Container in C zu implementieren, kann ineffizient sein. C-Makros ahmen C++-Vorlagen nach und sind so effizient wie eine C++-Vorlage.

  • Sie sagten: “Die Verwendung von void * zum Implementieren generischer Container in C kann ineffizient sein.” – Können Sie bitte erklären, warum Sie so denken?

    – Arun

    12. Juli 2013 um 16:47 Uhr

  • @Arun Ich denke, es hat mit der Lokalität des schlechten Gedächtnisses zu tun. Sie können Daten gut in einige Datenstrukturen legen, aber generisch void * wird wahrscheinlich auf den gesamten Adressraum Ihres Prozesses zeigen.

    – Val ist immer noch bei Monica

    24. August 2020 um 16:46 Uhr

Chuck Falconer hat eine anständige Hash-Bibliothek, die in C geschrieben ist und eine C++-Schnittstelle enthält. Klicken Sie zum Herunterladen auf hashlib.zip auf der Webseite.

Ben Pfaff hat eine sehr schöne und extrem gut dokumentierte binäre und ausgewogene Baumbibliothek, GNU-libavldas die meisten wichtigen Baumstrukturen implementiert, einschließlich binärer Suchbäume, AVL-Bäume, Rot-Schwarz-Bäume und Thread-Versionen von jedem.

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

Ich bin mir nicht sicher, wonach Sie in Bezug auf Arrays und verknüpfte Listen suchen, da ersteres direkt von der Sprache unterstützt wird und letzteres im Allgemeinen trivial genug ist, um implementiert zu werden, ohne dass eine Bibliothek erforderlich ist.

  • Ich habe mir kürzlich den Hash-Tisch von Chuck Falconer angesehen und er ist ziemlich gut. Meine einzige Beschwerde ist, dass es unklar ist, ob man es in einem kommerziellen Projekt verwenden kann. Er bittet Sie, ihn um Erlaubnis zu bitten.

    – Nick van Brunt

    12. Juni 2009 um 14:23 Uhr

  • @Nick: Es ist wirklich nichts Unklares über die Berechtigungen zur Verwendung des Hashlib-Codes von Falconer: Er ist eindeutig unter der GPL lizenziert. Wenn Ihr kommerzieller Code mit den GPL-Bedingungen einverstanden ist (im Grunde, wenn Ihr kommerzieller Code auch GPL-lizenziert ist), müssen Sie ihn nicht kontaktieren. Wenn Sie andere Lizenzbedingungen als die GPL wünschen, ist er offen dafür, diesbezüglich kontaktiert zu werden.

    – Michael Burr

    25. März 2010 um 18:25 Uhr

  • @Michael Burr: GPL und LGPL, kurz gesagt, können nicht in einer kommerziellen Umgebung oder einer echten Open-Source-Umgebung verwendet werden. Ich würde auch denen empfehlen, die dies als Lösung in Betracht ziehen, sich woanders umzusehen.

    Matthias N.

    6. Januar 2011 um 20:18 Uhr

  • @Zenikoder: Das gilt für viele, vielleicht sogar die meisten kommerziellen Projekte. Aber die Einzelheiten, ob GPL- oder LGPL-Code in einem kommerziellen Projekt verwendet werden kann oder nicht, hängen vollständig von den Anforderungen des kommerziellen Projekts ab. Ich habe an einigen Stellen gearbeitet, die mit der Verwendung von LGPL-Code in Ordnung waren, solange er nur in DLL-Form verwendet wurde.

    – Michael Burr

    6. Januar 2011 um 23:59 Uhr

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

Benutzeravatar von navicore
Navicore

Ich habe eine Bibliothek verwendet, die ich aus dem Buch “C Interface and Implementations” von Hanson aufgebaut habe. Seine Quelle kann heruntergeladen werden unter

cii-Buch-Website

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

  • Schließlich können Sie feststellen, dass der Code at ist code.google.com/p/cii und ist unter der äußerst flexiblen MIT-Lizenz lizenziert.

    – Jonathan Leffler

    24. Mai 2009 um 2:43 Uhr

  • Diese Bibliothek scheint keine feinkörnige Fehlerbehandlung im C-Stil zu bieten, sondern eher den groben Ansatz von Ausnahmen mit setjmp/longjmp. Es ist kein guter Kandidat für Code, bei dem die Betriebszeit kritisch ist.

    – Alex North-Keys

    4. Juli 2013 um 7:03 Uhr

Benutzeravatar von Jonathan Leffler
Jonathan Leffler

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

Ich habe einen generischen Cache zum Speichern beliebiger Objekte im Speicher von DJ Bernstein gefunden (http://cr.yp.to/djbdns.html) sauber, einfach und superschnell zu sein. Suchen Sie cache.h und cache.c im djdns-Tarball.

  • Schließlich können Sie feststellen, dass der Code at ist code.google.com/p/cii und ist unter der äußerst flexiblen MIT-Lizenz lizenziert.

    – Jonathan Leffler

    24. Mai 2009 um 2:43 Uhr

  • Diese Bibliothek scheint keine feinkörnige Fehlerbehandlung im C-Stil zu bieten, sondern eher den groben Ansatz von Ausnahmen mit setjmp/longjmp. Es ist kein guter Kandidat für Code, bei dem die Betriebszeit kritisch ist.

    – Alex North-Keys

    4. Juli 2013 um 7:03 Uhr

Benutzeravatar von Sandeep
Sandeep

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

  • Glib
  • iMatix-Standardfunktionsbibliothek
  • unterschiedliche Elemente aus den Linux-Kernel-Headern (z. B. Liste)

1418020cookie-checkContainerklasse/Bibliothek für C [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy