#c #list #struct #linked-list #malloc
#c #Список #структура #связанный список #malloc
Вопрос:
Я создал структуру, и в этой структуре есть метрика. Я генерирую серию этих структур и хочу отсортировать их в массив на основе этого показателя. В принципе, если метрика равна 0, я хочу, чтобы она была в списке в слоте [0] массива, если метрика равна 14, я хочу, чтобы она была в списке в слоте [14] массива. Привязка к метрике (размеру массива) является переменной, основанной на той же переменной, на основе которой генерируются структуры, поэтому мне нужно, чтобы массив объявлялся динамически с помощью malloc. Я экспериментировал с тем, как получить этот массив списков моей структуры. Я не могу в этом разобраться. Я погуглил проблему и не смог найти решение.
Кроме того, как только у меня будет массив, как мне добавить другой элемент в список конкретной ячейки массива? А затем вернитесь назад и сравните все элементы списка в i-й ячейке с элементами (n-i)-й ячейки?
Редактировать: Также может помочь то, что не все показатели будут иметь элементы.
Правка 2: Я пробовал это, и, похоже, возникли некоторые проблемы.
list<s_pair> *pairs;
pairs = (list<s_pair>*) malloc(sizeof(list<s_pair>) * (N 1));
j = { a, b };
pairs[m].push_back(j);
где m — метрика для j, имеющая тип s_pair. Это позволяет мне компилировать, но оно застревает при попытке push_back(j).
Комментарии:
1. Существует ли когда-либо только одна структура с каждой метрикой и является ли ваш дистрибутив плотным (иначе говоря, имеет мало отверстий или вообще не имеет)? Пожалуйста, имейте в виду, что
declaring
это не имеет того значения, которое вы используете, вы хотитеdefining
илиallocating
. Это особенно важно для C и Си , где все они являются отдельными и четко определенными понятиями. (defining
подразумеваетdeclaring
, но не наоборот)2. Нет. Каждая метрика потенциально может не содержать структур или иметь набор структур. И я должен был бы сказать, что четверть показателей может не содержать никаких структур, но у остальных должна быть хотя бы одна. Также, отмечено. Что делает объявление, чего не делает определение?
3. Похоже, вы описываете хэш-таблицу с открытой цепочкой. (ваша метрика — это хэш-функция)
4. Взгляните на стандарт C, который определяет эти понятия. В свободном доступе есть черновики. В любом случае, вам нужна одна для всех ваших справочных потребностей.
5. В C это почти наверняка ошибка с
malloc
вашейlist
стороны, поскольку это резервирует пространство, но не создает никаких объектов. Я бы рекомендовал выбрать язык, поскольку ответ на каждом из них совершенно разный.
Ответ №1:
В C вы могли бы сделать:
#include <vector>
#include <list>
size_t metric(s_pair const amp;);
class MyTable
{
std::vector< std::list<s_pair> > table;
public:
void insert(s_pair s)
{
size_t index = metric(s);
if ( index 1 > table.size() )
table.resize(index 1);
table[index].push_back(s);
}
};
(очевидно, у вас были бы другие функции для доступа к таблице и так далее).
В этой настройке это не будет работать очень хорошо, если metric
может быть огромное число (скажем, 2 миллиарда). В этом случае вам нужен разреженный массив вместо вектора (в C нет стандартного разреженного массива, но вы можете найти его или создать).
Пример использования:
int main()
{
MyTable items;
items.insert( whatever );
}
В этом примере показатели без элемента представлены пустыми списками.
Комментарии:
1. Если вы раньше не часто использовали C , вы должны убедиться, что
s_pair
имеет надлежащую семантику значений (чтобы при копировании или перемещении они оставались действительными объектами). Самый простой способ сделать это — сделать так, чтобы в нем были только переменные-члены, которые сами имеют надлежащую семантику значений.