Не существует простой оптимальной структуры - для любого данного фиксированного сопоставления могут быть жестокие оптимизации с переворотом для этого точного сопоставления, которые лучше или хуже для разных архитектур и разных входов. Карта / словарь должны быть все время хороши, а код довольно прост.
Мой официальный совет - придерживаться этого. Производительность поиска вряд ли будет проблемой для такого кода, поскольку, скорее всего, вы можете легко кодировать / декодировать быстрее, чем вы можете вводить / выводить.
Поскольку это учебное упражнение, и вы хотите опробовать различные возможности: для текста -> Морзе вы можете использовать массив, а не карту / словарь. Возможно удивительно, это трудно сделать в C ++ и быть полностью переносимым. Далее предполагается, что все заглавные буквы имеют значения char
, превышающие A
, что не гарантируется стандартом:
std::string encode['Z'-'A'];
encode['A' - 'A'] = ".-";
encode['B' - 'A'] = "-...";
// etc.
encode['Z' - 'A'] = "--..";
Если вы хотите предположить, что ваш код будет работать только на машинах, базовый набор символов которых содержит буквы в непрерывном режиме (верно для ASCII, но не для EBCDIC), вы можете немного привести его в порядок:
std::string encode[26] = {".-", "-...", /* etc */ "--.."};
Для поиска символа, хранящегося в переменной c
:
morse = encode[c - 'A'];
Версия Python может предполагать ASCII (я думаю), и вам придется добавить некоторое использование ord
.
Чтобы справиться с чем-либо, кроме букв верхнего регистра, вам нужен либо больший массив (содержащий запись для каждого возможного значения символа), либо несколько массивов с проверками границ, специальным кодом для пунктуации и т. Д.