2010-12-29 2 views
2

Как построить и получить доступ к набору пар ключ-значение в C? Чтобы использовать глупый простой пример, допустим, я хочу создать таблицу, которая переводит между целым числом и его квадратным корнем.словарь данных/карта/ключевые значения пара данных в C

Если бы я писал JavaScript, я мог бы просто сделать это:

var squareRoots = { 
    4: 2, 
    9: 3, 
    16: 4, 
    25: 5 
} 

, а затем получить доступ к ним как:

var squareRootOf25 = squareRoots[5] 

Что самый красивый способ сделать это в C? Что делать, если я хочу использовать один тип перечисления в качестве ключа и другого типа перечисления в качестве значения?

ответ

3

Чтобы достичь этого, вы можете рассмотреть реализацию хэша на языке C. Основы хеширования относятся к Wikipedia. Обратитесь к этому question за более подробной информацией и ссылками.

Этот link дает хороший обзор и детали реализации.

+0

Не записывая язык, специфичный для домена, для генерации кода C или файла ресурса, вы не можете разумно указать предопределенную таблицу поиска во время компиляции, поскольку вопрос, как представляется, предлагается. Даже отсортированный массив для двоичного поиска склонен к упорядочению ошибок. +1 все равно, потому что это почти наверняка не имеет значения. Просто заполните свою структуру данных во время инициализации ваших приложений из простого массива элементов. Затраты времени исполнения редко случаются редко. Пример Javascript эффективно делает это в любом случае, но с кодом для заполнения контейнера. – Steve314

+0

Время работы в режиме реального времени отлично подходит для моих текущих потребностей. – morgancodes

1

Там нет встроенного способа сделать это, если не считать инициализации массива, как это в C99:

double squareRoots[] = 
{ 
    [4] = 2.0, 
    [9] = 3.0, 
    [16] = 4.0, 
    [25] = 5.0, 
}; 

Однако, это выделяет 26 элементов в массиве; остальные значения равны нулю.

Предполагая, что вы это не имели в виду, посмотрите на C Interfaces and Implementations от D R Hanson; он показывает способ реализации ассоциативных массивов (ака хэшей или словарей).

+0

Хороший урок в C99, хотя - я не знал об этом синтаксисе. – Steve314

1

Вы также можете использовать libghthash для хэшей общего назначения. Они довольно просты в использовании и включены в ваше приложение. Тем не менее, это сторонний API, поэтому, если это проблема, вам придется реализовать свои собственные.

Там нет встроенного в ассоциированных таблицах массива/хэша в С.

Инициализация массива (C99), вероятно, лучший способом пойти, если у вас есть не-цифровые клавиши:

T hash[] = { 
    [1] = tObj, 
    [255] = tObj2, 
}; 
0

Вы можете использование map реализовано как часть clib библиотека

Смежные вопросы