Ассоциативные массивы, симметричный алгоритм, CTFE - PullRequest
1 голос
/ 22 мая 2011

Я хочу реализовать что-то вроде шифра Vigenère , и я решил использовать ассоциативные массивы D.Я использую

struct Codes
{
    int[char] enc;
    char[int] dec;
}

, а затем я заполняю AA с помощью

foreach(immutable char c; letters ~ whitespace ~ digits)
{
    codes.enc[c] = codes.enc.length;
    codes.dec[codes.enc.length] = c;
}

. Это работает так, как предполагается, для работы с моими [en / de] функциями шифрования, но у меня есть двавопросы:

  1. Как я могу, если могу, использовать только один АА.Или это какая-то другая структура данных, которая так же проста в использовании, более эффективна или лучше соответствует пункту 2.
  2. Как мне использовать CTFE для генерации некоторой структуры данных во время компиляции и использовать вывод ввремя выполнения.

(я использую компилятор dmd v2.053, если это имеет значение в наши дни).

1 Ответ

3 голосов
/ 22 мая 2011

dec может быть обычным массивом (он равен letters ~ whitespace ~ digits btw)

в enc вы также можете использовать обычный массив, если вы разрешаете только ASCII в качестве символов (длиной 255 и приведением c к int для индекса)

редактировать

Вы можете создать строку миксина из строки letters ~ whitespace ~ digits, например,

string createSwitch(string seq,string inp){
    string out = "switch("~inp~"){";
    int i=0;
    foreach(ch;seq){
        out~="case "~ch~":return "~i";";
    }
    out~="default: return -1;";
    return out;
}

, который затем можно использовать как

int intFromChar(char ch){
    mixin(createSwitch(letters ~ whitespace ~ digits,"ch"));
}
...