Intereting Posts
Является ли функция crypt () объявлена ​​в unistd.h или crypt.h? C / C ++ Lock-free (или неблокирующий) Ring Buffer, который ПЕРЕЗАПИСИВАЕТ самые старые данные? Какой эффективный алгоритм времени для копирования неровных бит-массивов? Генерация случайного гауссовского двойника в Objective-C / C sigaction: восстановить обработчик или нет? C игра с угадыванием номера с проверкой isdigit () Целочисленные и логические типы для использования во встроенной системе с двумя архитектурами Вычитание адреса массива в C используя выход программы как входной в ту же программу Strdup каждую строку в массив? О поиске ученика в видео Копирование переменных одной внутренней структуры в другую внутреннюю структуру с использованием функции, которая принимает адрес одной внутренней структуры как параметр Высылать данные по паролю libcurl HTTPS? GCC 5.1 Loop unrolling Какое общее неопределенное / неуказанное поведение для C, с которым вы столкнулись?

хранить известные пары ключ / значение в c

В настоящее время я изучаю c. Я пишу веб-сервер в качестве упражнения.
Теперь я должен хранить коды состояния и фразы.

Каков наилучший способ хранения этих пар ключ / значение?

Моя первая ставка была hashмапом. Но в c нет встроенной реализации. Поэтому мне придется использовать библиотеку.

    Как и другие ответы, я бы также рекомендовал использовать массив строк в качестве справочной таблицы. Если вы предполагаете, что все коды состояния уникальны, массив строк является самой простой реализацией для меньшего набора данных.

    Как только вы начнете хранить большие объемы данных, то есть когда hash-карты начинают становиться полезными. Массив поиска – это решение здесь, но, как вы сказали, вы изучаете C, вы можете фактически реализовать хеш-таблицу в native C с помощью динамической памяти (критическая концепция для обучения C.). На этом веб-сайте объясняется, как создать hash-таблицу в C очень хорошо.

    http://www.sparknotes.com/cs/searching/hashtables/section3.rhtml

    Я бы использовал отсортированный массив.

    Вы можете определить массив в любом порядке и отсортировать его во время выполнения (один раз) с помощью qsort() . Затем вы можете выполнять двоичный поиск с помощью bsearch() . Общее количество кодов ответов невелико, бинарный поиск будет очень быстрым.

    Это имеет то преимущество, что не требуется никакого внешнего кода, для чего-то простого.

    Вот альтернативная идея, которая имеет преимущество в скорости, имея некоторые издержки памяти.

    В принципе, простейшая форма хеш-таблицы, где hash-функция – это идентификатор (код -> код), также известный как таблица поиска.

    Для этого, зная, что коды состояния HTTP ограничены 5xx, вы можете предположить, что 599 будет самым высоким, что вам нужно, поэтому вы создадите таблицу с 600 элементами.

    Эта таблица может быть выполнена следующим образом:

     const char * status_messages[600]; 

    Инициализация довольно проста:

     /* initialize all with NULL's so invalid codes correspond to NULL pointers */ memset(status_messages, (int)NULL, 600 * sizeof(const char *)); /* ... */ status_messages[403] = "Forbidden"; status_messages[404] = "Not found"; /* ... */ 

    Выяснение сообщения также мертво-просто:

     int code = 403; const char * message = status_messages[code]; 

    Этот массив будет иметь размер 2400 байт (4800 на 64-битных платформах), но гарантированно будет время доступа O (1).

    Возможно, вы можете создать структуру с K \ V в ней.

    Вот так:

     struct key_value { int key; char* value; }; struct key_value kv; kv.key = 1; kv.value = "foo";