2008-11-20 25 views
69

¿Alguien sabe de alguna biblioteca de contenedor C? Estoy buscando algo que proporcione implementaciones estándar de listas vinculadas, matrices, tablas hash, etc., de forma muy parecida a como lo hace C++ STL. Las preocupaciones clave son:Clase/biblioteca de contenedor para C

  1. El código de cliente debe poder crear contenedores para múltiples tipos de datos diferentes sin modificar la biblioteca.
  2. La interfaz para crear y usar los contenedores debe ser intuitiva.
+24

¿Por qué exactamente esto se considera fuera de tema? Ciertamente, parece estar dentro de la categoría de "herramientas de software comúnmente utilizadas por los programadores", ya que una biblioteca de códigos (especialmente de este tipo) es una de las herramientas más básicas que utilizaría un programador. Además de eso, parece que DOCENAS de preguntas vinculan a esta pregunta como "duplicados", lo que me deja claro que esta información es comúnmente solicitada. –

+10

siempre es gracioso ver que muchas de las preguntas cerradas de so son las más útiles al menos para mí (¡con muchos votos!) ¡¡Y para mí, parece realmente sobre el tema esa pregunta !! – Ivan

+0

GLib es bastante agradable y proporciona [listas vinculadas] (https://developer.gnome.org/glib/2.38/glib-Doubly-Linked-Lists.html), [tablas hash] (https: //developer.gnome .org/glib/2.38/glib-Hash-Tables.html) y muchos más. También puede usar funciones hash personalizadas, y puede administrar la memoria de sus entradas. La sintaxis es un poco prolija al principio, pero si te acostumbras, está bien orientada a objetos. – jdm

Respuesta

22

Me encontré con SGLIB mientras buscaba una implementación C de un contenedor de mapa/diccionario. Desafortunadamente, no hay un mapa, pero parece incluir los contenedores sobre los que preguntaste. No tengo idea de lo bueno que es.

http://sglib.sourceforge.net.

+3

A partir de 2013-07, ese proyecto de sourceforge parece estar muerto. Observé que los documentos no mencionaban la palabra "error" en ninguna parte, ni mencionaban el manejo de errores. La Biblioteca C Container de Jacob Navia es mucho, mucho mejor en esta área, y tiene ~ 370 páginas de documentación formal, pero lamentablemente, su ccl no es de código abierto. –

+0

A partir de mayo de 2014, el enlace no está muerto. – 010110110101

+1

En realidad, la Biblioteca C Container de Jacob Navia es de código abierto. Consulte https://code.google.com/p/ccl/. Envié un correo electrónico al autor y confirmé que las restricciones "no comerciales" mencionadas en otra parte de su sitio no lo hacen. aplicar a CCL. – starseeker

10

Chuck Falconer tiene una biblioteca hash decente escrita en C que incluye una interfaz C++, haga clic en hashlib.zip en la página web para descargar.

Ben Pfaff tiene una biblioteca de árbol binaria y equilibrada muy buena y extremadamente bien documentada, GNU libavl, que implementa la mayoría de las estructuras arbóreas incluyendo árboles binarios de búsqueda, árboles AVL, árboles rojo-negros y versiones enhebradas de cada uno.

libavl está bajo la licencia LGPL (a partir de la versión 2.0.3), hashlib es GPL.

No estoy seguro de lo que está buscando en cuanto a arreglos y listas enlazadas, ya que el primero es compatible directamente con el idioma y este último es generalmente lo suficientemente trivial para implementar sin justificar una biblioteca.

+1

Hace poco eché un vistazo a la tabla hash de Chuck Falconer y es bastante buena. Mi única queja es que no está claro si se puede usar en un proyecto comercial. Él le pide que se ponga en contacto con él para obtener permiso. –

+2

@Nick: no hay nada realmente claro sobre los permisos para usar el código hashlib de Falconer: está claramente autorizado bajo la GPL. Si su código comercial está bien con los términos GPL (básicamente, si su código comercial también tiene licencia GPL) no es necesario que se contacte con él. Si quiere otros términos de licencia que la GPL, está abierto para que lo contactemos. –

+1

@Michael Burr: GPL y LGPL a corto plazo no se pueden usar en un entorno comercial o en un verdadero entorno de código abierto.Sugeriría también a aquellos que consideren esto como una solución para buscar en otra parte. –

5

He estado usando una biblioteca que he estado desarrollando a partir del libro "C Interface and Implementations" de Hanson. Su fuente es descargable en

cii book website

todo es un tipo abstracto de datos. Hay Lista, Conjunto, Tabla (mapa).

+4

Eventualmente, puede encontrar que el código está en http://code.google.com/p/cii/ y está licenciado bajo la extremadamente flexible licencia de MIT. –

+0

Esta biblioteca no parece ofrecer un tratamiento de errores de grano fino al estilo C, sino más bien el enfoque aproximado de excepciones con setjmp/longjmp. No es un buen candidato para el código donde el tiempo de actividad es crítico. –

2

#include "queue.h" para tener acceso a las implementaciones de listas de enlace único, colas de cola enlazadas individualmente, listas y colas de espera.

Encontré una memoria caché genérica para almacenar objetos arbitrarios en la memoria por D. J. Bernstein (http://cr.yp.to/djbdns.html) para que sea a la vez limpia, simple y súper rápida. Busque cache.h y cache.c en djdns tarball.

6

Sglib es una excelente biblioteca genérica de estructuras de datos. Actualmente la biblioteca proporciona implementación genérica para:

  • matrices de clasificación
  • listas enlazadas
  • listas enlazadas ordenados
  • enumera los dobles enlaces
  • árboles rojo-negro
  • contenedores de hash

Es muy rápido. Más rápido que eso. Está inspirado en la Biblioteca de plantillas estándar.Download here

Otra solución es Attractive Chaos sotware. C macro de biblioteca:
kbtree.h: biblioteca B-árbol eficiente en C.
khash.h: rápido y biblioteca tabla hash ligero de peso en C.
kvec.h: recipiente de vector simple en C.

Kulesh Shanmugasundaram presenta la Lista genérica de enlaces del kernel de Linux y una tabla hash genérica basada en la Lista de enlaces del kernel de Linux.

Sglib y Attractive Chaos sotware y Linux Kernel Linked List son C macotecas. Usar void* para implementar contenedores genéricos en C puede ser ineficiente. Las macros C imitan las plantillas C++ y son tan eficientes como una plantilla C++.

+1

Usted dijo "Usar void * para implementar contenedores genéricos en C puede ser ineficiente". - ¿Puedes explicar por qué piensas eso? – Arun

2

Algunos de los que he oído de (pero nunca se utilicen) se

  • Glib
  • iMatix estándar Función Biblioteca
  • elementos dispares de las cabeceras del núcleo de Linux (por ejemplo, lista)
7

¿Qué tal ccl? Esta es una biblioteca de contenedores para C. Quizás sea la más adecuada para usted. Puede ver https://code.google.com/p/ccl/. Disfrútalo.

+2

Esta respuesta * no * fue dada por @navicore. Él estaba hablando de una biblioteca diferente con un acrónimo de pocos píxeles diferentes. –

Cuestiones relacionadas