C 용 컨테이너 클래스 / 라이브러리 [닫힘]


78

누구든지 C 컨테이너 라이브러리를 알고 있습니까? C ++ STL이하는 것과 같은 방식으로 연결된 목록, 배열, 해시 테이블 등의 표준 구현을 제공하는 것을 찾고 있습니다. 주요 관심사는 다음과 같습니다.

  1. 클라이언트 코드는 라이브러리를 수정하지 않고도 다양한 데이터 유형에 대한 컨테이너를 생성 할 수 있어야합니다.
  2. 컨테이너를 만들고 사용하기위한 인터페이스는 직관적이어야합니다.

답변:


24

지도 / 사전 컨테이너의 C 구현을 찾는 동안 방금 SGLIB를 발견했습니다. 불행히도지도는 없지만 요청한 컨테이너가 포함 된 것 같습니다. 얼마나 좋은지 모르겠습니다.

http://sglib.sourceforge.net .


3
2013-07 년 현재 소스 포지 프로젝트는 죽은 것으로 보입니다. 문서에서 "오류"라는 단어를 어디에도 언급하지 않았고 오류 처리도 언급하지 않았습니다. Jacob Navia의 C 컨테이너 라이브러리는이 영역에서 훨씬 더 뛰어나며 ~ 370 페이지의 공식 문서를 보유하고 있습니다.하지만 슬프게도 그의 ccl은 오픈 소스가 아닙니다.
Alex North-Keys

2014 년 5 월 현재 링크가 끊어지지 않았습니다.
010110110101

1
사실 Jacob Navia의 C 컨테이너 라이브러리는 오픈 소스입니다. code.google.com/p/ccl을 참조하세요 . 저자에게 이메일을 보냈고 그의 사이트에 언급 된 "비영리적"제한 사항이 CCL에 적용되지 않음을 확인했습니다.
starseeker

11

Sglib 는 뛰어난 일반 데이터 구조 라이브러리입니다. 라이브러리는 현재 다음에 대한 일반 구현을 제공합니다.

  • 배열 정렬
  • 연결 목록
  • 정렬 된 연결 목록
  • 이중 연결 목록
  • 빨강-검정 나무
  • 해시 된 컨테이너

매우 빠릅니다. 그 glib 더 빨리. 표준 템플릿 라이브러리에서 영감을 얻었습니다. 여기에서 다운로드

또 다른 솔루션은 매력적인 카오스 소프트웨어 입니다. C 매크로 라이브러리 :
kbtree.h : C의 효율적인 B- 트리 라이브러리.
khash.h : C의 빠르고 가벼운 해시 테이블 라이브러리.
kvec.h : C의 간단한 벡터 컨테이너.

Kulesh Shanmugasundaram 은 일반 Linux Kernel Linked List와 Linux Kernel Linked List를 기반으로하는 일반 해시 테이블을 제공합니다.

Sglib 및 매력적인 Chaos 소프트웨어와 Linux Kernel Linked List는 C 매크로 라이브러리입니다. void*C에서 일반 컨테이너를 구현하는 데 사용 하는 것은 비효율적 일 수 있습니다. C 매크로는 C ++ 템플릿을 모방하고 C ++ 템플릿만큼 효율적입니다.


2
"void *를 사용하여 C에서 제네릭 컨테이너를 구현하는 것은 비효율적 일 수 있습니다."라고 말했습니다. -왜 그렇게 생각하는지 설명해 주시겠습니까?
Arun

@Arun 나는 그것이 나쁜 메모리 지역 성과 관련이 있다고 생각합니다. 일부 데이터 구조 내에 데이터를 멋지게 배치 할 수 있지만 일반 void *은 프로세스의 주소 공간 전체를 가리킬 것입니다.
발은 분석 재개 모니카 말한다

10

Chuck Falconer 에는 C ++ 인터페이스가 포함 된 C로 작성된 괜찮은 해시 라이브러리가 있습니다. 웹 페이지에서 hashlib.zip을 클릭하여 다운로드하세요.

Ben Pfaff 는 이진 검색 트리, AVL 트리, 레드-블랙 트리 및 각각의 스레드 버전을 포함한 대부분의 주요 트리 구조를 구현하는 매우 훌륭하고 매우 잘 문서화 된 바이너리 및 균형 잡힌 트리 라이브러리 인 GNU libavl 을 가지고 있습니다.

libavl은 LGPL (버전 2.0.3 기준)에 따라 사용이 허가되고 hashlib는 GPL입니다.

전자는 언어에 의해 직접 지원되고 후자는 일반적으로 라이브러리를 보증하지 않고 구현하기에 충분히 사소하기 때문에 배열 및 연결 목록에 관한 한 당신이 찾고있는 것이 무엇인지 잘 모르겠습니다.


1
최근에 Chuck Falconer의 해시 테이블을 봤는데 꽤 좋습니다. 내 유일한 불만은 상업 프로젝트에서 사용할 수 있는지 확실하지 않다는 것입니다. 그는 그에게 연락하여 허가를 요청합니다.
Nick Van Brunt

2
@Nick : Falconer의 hashlib 코드 사용 권한에 대해 명확하지 않은 것은 없습니다. GPL에 따라 명확하게 라이선스가 부여되었습니다. 상용 코드가 GPL 조건에 맞으면 (기본적으로 상용 코드도 GPL 라이선스가있는 경우) 그에게 연락 할 필요가 없습니다. GPL 이외의 다른 라이선스 조건을 원하는 경우 그는 이에 대해 연락을받을 수 있습니다.
Michael Burr

2
@Michael Burr : 간단히 말해서 GPL 및 LGPL은 상용 환경이나 진정한 오픈 소스 환경에서 사용할 수 없습니다. 나는 이것을 다른 곳에서 보는 해결책으로 생각하는 사람들에게도 제안하고 싶습니다.

1
@Zenikoder : 그것은 많은, 아마도 대부분의 상업 프로젝트에 해당됩니다. 그러나 GPL 또는 LGPL 코드를 상용 프로젝트에 사용할 수 있는지 여부는 전적으로 상용 프로젝트의 요구 사항에 따라 다릅니다. DLL 형식으로 만 사용되는 한 LGPL 코드를 사용하여 괜찮은 몇 곳에서 작업했습니다.
Michael Burr 2011 년

7

ccl은 어떻습니까? 이것은 C 용 컨테이너 라이브러리입니다. 아마도 여러분에게 가장 적합 할 것입니다. https://code.google.com/p/ccl/ 을 볼 수 있습니다 . 그것을 즐기십시오.


2
이 답변은 아직 @navicore에서 제공 하지 않았습니다 . 그는 몇 픽셀이 다른 두문자어를 가진 다른 라이브러리에 대해 이야기하고있었습니다.
Alex North-Keys

5

저는 Hanson의 "C Interface and Implementations"책에서 성장한 라이브러리를 사용하고 있습니다. 그의 출처는

cii 책 웹 사이트

모든 것이 추상 데이터 유형입니다. 목록, 세트, ​​테이블 (지도)이 있습니다.


4
결국 코드가 code.google.com/p/cii 에 있으며 매우 유연한 MIT 라이선스에 따라 라이선스가 부여 되었음을 알 수 있습니다 .
Jonathan Leffler

이 라이브러리는 C 스타일의 세분화 된 오류 처리를 제공하지 않고 setjmp / longjmp를 사용하여 예외에 대한 대략적인 접근 방식을 제공하는 것 같습니다. 가동 시간이 중요한 코드에는 적합하지 않습니다.
Alex North-Keys

2

#include "queue.h" 단일 연결 목록, 단일 연결 테일 큐, 목록 및 테일 큐 구현에 액세스 할 수 있습니다.

DJ Bernstein ( http://cr.yp.to/djbdns.html )이 메모리에 임의의 객체를 저장하기위한 일반적인 캐시가 깨끗하고 간단하며 매우 빠르다는 것을 발견했습니다. djdns tarball에서 cache.h 및 cache.c를 찾습니다.


2

내가 들어 본 적이있는 (하지만 사용하지 않은) 것들 중 일부는

  • 말 잘하는
  • iMatix 표준 기능 라이브러리
  • Linux 커널 헤더 (예 : 목록)에서 분리 된 요소

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.