2016-02-17 8 views
0

У меня относительно небольшое std::unordered_map<char, int> всего 8 символов. Тем не менее, я хотел бы выполнить итерацию через них и установить для каждого символа значение 0-9.Condense Multiple Nested For Loops

Штрихи d, e, m, n, o, r, s, y.

я мог бы сделать что-то вдоль линий:

std::unordered_map<char, int> letters; 
for(int d = 0; d < 10; ++d) 
    for(int e = 0; e < 10; ++e) 
     for(int m = 0; m < 10; ++m) 
      // continued 
      letters['d'] = d; // etc... 

Но это не кажется разумным вообще, и становится все более и более утомительно, как буквенных счета увеличивается. Должен быть лучший способ сделать это.

+0

'' é' и M' никогда не используются в цикле, так почему бы не упростить только один цикл по 'd'? – Soren

+0

Если я получил OP справа, '// etc ...' означает 'letters ['e'] = e; буквы ['m'] = m; ... ' – Anedar

+0

Возможно, но он попросил упрощения, и ваша интерпретация будет уничтожать значения на каждой итерации, делая ее бесполезной, но вы правы, и я не уверен, если он просить лучшего способа написания плохого кода или способа исправить плохой код. – Soren

ответ

2

Если я получил вас правильно, вы хотите выполнить итерацию каждой возможной комбинации, как значения 0-9 могут быть назначены на 8 букв.

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

00000000 - 99999999 
|||||||| |||||||| 
demnorsy demnorsy 

Конечно, вы можете сделать то же самое с другими числами цифр, но его очень легко увидеть идею в десятичной системе счисления.

Так легкий путь:

std::unordered_map<char, int> letters; 
std::vector<char> chars= {'d', 'e', 'm', 'n', 'o', 'r', 's', 'y'}; 
for (int N=0; N<pow(10,chars.size()); ++N){ 
    for(int i=0; i<chars.size();++i) 
     letters[chars[i]] = (N/pow(10,i))%10; //integer division 

    //whatever you want to do with your permutation, do it here 
} 
+0

'letters [chars [i]] = ...' переопределяет один и тот же элемент в каждом цикле, вытирая данные из предыдущей итерации, - это намерение? – Soren

+0

@Soren: Поскольку OP имеет только одну карту и делает то же самое, я так думаю. Вот почему я добавил комментарий «используйте перестановку здесь». – Anedar