Стандартные коллекции языка C Где они? - PullRequest
15 голосов
/ 23 марта 2010

Я посвятил себя изучению C сейчас, я хорошо разбираюсь в Python / PHP / Bash, но я решил, что я ограничен тем, что не владею C. Но я не могу представить себе работу на языке без списков и хэшей, может быть, я просто прыгаю из пистолета, но наверняка есть «стандартные» библиотеки коллекций. Я не вижу ничего в стандартной библиотеке GNU, хотя, какие-либо предложения?

Ответы [ 8 ]

15 голосов
/ 23 марта 2010

Не существует "стандартного" набора классов сбора для C. Многие люди просто бросают свои собственные по мере необходимости.

Но, конечно, есть некоторые библиотеки, заполняющие этот пробел. Например, glib предлагает связанные списки, хеш-таблицы и различные виды деревьев.

12 голосов
/ 23 марта 2010

C ниже, чем вы привыкли. За пределами массива в С нет стандартных коллекций.

5 голосов
/ 23 марта 2010

Может быть, вы должны попробовать заглянуть в бой. Хотя он не является стандартом в том же смысле, что и STL для C ++, он является проверенной библиотекой и используется во многих приложениях.

http://library.gnome.org/devel/glib/2.22/

2 голосов
/ 24 марта 2010

Стандартов нет, но есть превосходная альтернатива, которая намного проще, чем glib : C Дейва Хансона Интерфейсы и реализации . Он включает в себя несколько эффективных абстракций коллекции и ряд других полезных модулей. Программное обеспечение бесплатное, и книгу стоит купить.

0 голосов
/ 03 апреля 2018

Интерфейс cdcontainers аналогичен C ++ STL https://github.com/maksimandrianov/cdcontainers

#define CDC_USE_SHORT_NAMES  // for short names (functions and structs without prefix cdc_*)
#include <cdcontainers/vector.h>
#include <cdcontainers/casts.h>
#include <stdio.h>

int main(int argc, char** argv)
{
    vector_t *v;
    size_t i;

    if (vector_ctor(&v, NULL) != CDC_STATUS_OK)
        /* error handling */;

    if (vector_push_back(v, CDC_INT_TO_PTR(7)) != CDC_STATUS_OK)
        /* error handling */;

    if (vector_push_back(v, CDC_INT_TO_PTR(8)) != CDC_STATUS_OK)
        /* error handling */;

    for (i = 0; i < vector_size(v); ++i)
        printf("%i ", CDC_PTR_TO_INT(vector_get(v, i)));

    printf("\n");

    vector_dtor(v);

    return 0;
}
0 голосов
/ 04 декабря 2017

В зависимости от вашей системы вы можете найти то, что ищете, в sys / queue.h , который включает в себя «реализации односвязных списков, двусвязных списков, простых очередей и хвоста». очереди».

0 голосов
/ 23 марта 2010

Нет «стандартных» (как в части стандарта ISO C) контейнерных библиотек, по крайней мере, не в C99. Я видел несколько сторонних попыток; у всех была та или иная степень потери.

C имеет очень примитивный и скудный инструментарий; Я сравнил программирование на С со строительством дома, где нет ничего, кроме ручной пилы и гвоздодера.

0 голосов
/ 23 марта 2010

На самом деле нет стандартных коллекций в C. Будучи языком очень низкого уровня (по сравнению с C ++ и более «современными» языками)

C ++ добавляет их через Стандартную библиотеку шаблонов . Большинство «коллекций», таких как хеширование и списки, основаны на объектно-ориентированных или универсальных методах программирования, недоступных (кроме как через соглашение) в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...