压缩多个嵌套循环

时间:2016-02-17 00:43:21

标签: c++ for-loop optimization

我的std::unordered_map<char, int>只有8个字符。但是,我想迭代它们并将每个字符设置为值0-9。

字符为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...

但这看起来并不谨慎,随着字母数量的增加变得越来越乏味。必须有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分: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
}