Портирование станд.:: отобразиться на C?

Решает ли ваша проблема ваша проблема?

fig, ax = plt.subplots()
ax2 = ax.twinx()
ax.bar(df_eg.index, df_eg["Release"], color=(190/255,190/255,190/255,0.7), label='Release')
ax2.plot(df_eg.index, df_eg["Hold"], color='green', label='Hold')
ax.set_xticklabels(df_eg.index)
ax.legend(loc='best')

20
задан kthakore 15 March 2009 в 01:21
поделиться

5 ответов

Много реализаций C поддерживают tsearch (3) или hsearch (3). tsearch (3) является двоичным деревом, и можно обеспечить обратный вызов компаратора. Я думаю, что это почти настолько близко, как Вы собираетесь добраться до станд.:: карта.

Вот некоторый c99 пример кода

#include <search.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

typedef struct
{
      int key;
      char* value;
} intStrMap;

int compar(const void *l, const void *r)
{
    const intStrMap *lm = l;
    const intStrMap *lr = r;
    return lm->key - lr->key;
}

int main(int argc, char **argv)
{
    void *root = 0;

    intStrMap *a = malloc(sizeof(intStrMap));
    a->key = 2;
    a->value = strdup("two");
    tsearch(a, &root, compar); /* insert */

    intStrMap *find_a = malloc(sizeof(intStrMap));
    find_a->key = 2;

    void *r = tfind(find_a, &root, compar); /* read */
    printf("%s", (*(intStrMap**)r)->value);

    return 0;
}
25
ответ дан 29 November 2019 в 23:09
поделиться

Это - конечно, одна возможная реализация. Вы могли бы хотеть рассмотреть, как Вы реализуете индексацию и какое влияние производительности, которое будет иметь. Например, у Вас мог быть список intKey быть отсортированным списком ключей. Поиск ключа был бы O (зарегистрируйте N), время, но вставка нового объекта была бы O (N).

Вы могли реализовать его как дерево (как станд.:: карта), и затем у Вас был бы O (зарегистрируйте N), вставка и поиск.

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

5
ответ дан 29 November 2019 в 23:09
поделиться

Можно реализовать его однако, Вы выбираете. При использовании подхода связанного списка вставка будет O (1), но извлечение и удаление будут O (n). При использовании чего-то более сложного как красно-черное дерево, у Вас будет намного лучшая средняя производительность.

при реализации его сами, связанный список является, вероятно, самым легким, иначе захватывание некоторых соответственно лицензировало красно-черный или другой тип дерева из Интернета, будет наилучший вариант. Реализация Вашего собственного красно-черного дерева не рекомендуется... Я сделал это и предпочел бы не делать это снова.

И отвечать на вопрос Вы не спросили: возможно, необходимо вновь исследовать, предоставляет ли портирование на C от C++ действительно все преимущества, которые Вы хотели. Конечно, существуют ситуации, где это могло быть необходимо, но нет многих.

3
ответ дан 29 November 2019 в 23:09
поделиться

Нет никакой стандартной библиотеки в C, который обеспечивает функциональность, аналогичную карте. Необходимо будет реализовать собственную подобную карте функциональность с помощью некоторой формы контейнера, который поддерживает элементы доступа через ключи.

0
ответ дан 29 November 2019 в 23:09
поделиться

человек dbopen

Обеспечивает ПУСТОЙ УКАЗАТЕЛЬ как аргумент файла, и это будет в оперативной памяти только контейнер для данных ключа/значения.

существуют также различные интерфейсы библиотеки базы данных Беркли с подобной функциональностью ключа/значения (человек dbm, выезд BerkeleyDB от Sleepycat, попробуйте некоторые поиски, и т.д.).

0
ответ дан 29 November 2019 в 23:09
поделиться