В настоящее время я кодирую физическое моделирование на решетке, мне интересно описать циклы в этой решетке, они замкнуты изогнутыми, образованными краями решетчатых ячеек. Я храню информацию об этих ячейках решетки (по информации я имею в виду логическую переменную, указывающую, является ли край ценным или нет для составления цикла) в трехмерном булевом массиве.
Теперь я думаю о хорошей структуре для обработки этих циклов. они в основном представляют собой список ребер, поэтому мне понадобится нечто вроде массива 3d-целых векторов, причем каждое ребро определяется тремя координатами в моей текущей параметризации. Я уже думаю о создании класса вокруг этого объекта "списка", поскольку мне понадобятся методы вычисления диаметра циклы и, возможно, больше в будущем.
Но я определенно не настолько осведомлен о выборе структуры, которую я должен сделать, мой физический фон не научил меня достаточно в C++. И поэтому я хотел бы услышать ваше предложение по формированию этого фрагмента кода. Мне бы очень понравилось открывать новые способы кодирования этого ребенка.
Вы хотите две разные вещи. Один отслеживании всех ребер и позволяет быстрый поиск краевых объектов по индексу (интермедиат, Int, Int) (вероятно, вы не хотите int
есть, но что - то вроде size_t
или так). Это полностью не зависит от вашей второй цели, разбивающей упорядоченные подмножества.
Так как ваша база данных ребер будет скудной (т.е. Только некоторые из возможных индексов будут фактически идентифицироваться как конкретный край), мое предварительное предположение о использовании 3D-матрицы непригодно. Вместо этого вы, вероятно, захотите найти края с хэш-картой.
Насколько это легко, зависит от ожидаемого размера отдельных целых чисел. То есть у вас может быть не более 21 бит на целое число (например, если ваши целые числа являются short int
значениями short int
, которые имеют только 16 бит), тогда вы можете объединить их в одно 64-битное значение, которое уже имеет std::hash
реализация std::hash
. В противном случае, вам придется реализовать свой собственный хэш - специализацию, например, std::hash<std::array<uint32_t,3>>
(который также довольно легко, и очень наращиваемых).
Как только вы можете хэшировать свой ключ, вы можете выбросить его в std::unordered_map
и сделать с ним. Это быстро.
Затем вы хотите иметь недолговечные структуры данных для идентификации циклов, поэтому вам нужна структура данных, которая распространяется на одном конце, но никогда на другом. Это означает, что вы, вероятно, хорошо работаете с std::vector
или, возможно, с std::deque
если у вас очень большие экземпляры (но сначала попробуйте вектор!).
Я бы предложил просто сохранить индекс в краю в локальном векторе. Вы всегда можете найти краевой объект в unordered_map. Тогда вопрос заключается в том, как представить индекс. Если Int представляет ваш целочисленный тип (например, int
, size_t
, short
,...), он, вероятно, наиболее последователен для использования std::array<Int,3>
---, если типы целых чисел отличаются, вы захотите std::tuple<...>
.