如何使用 pair 遍历所有可能的字符对?

How do I iterate through all possible pairs of characters using pair?

我想要做的是将 map<pair<char, char>, double> 的所有值初始化为 1,其中字符对仅包含小写字母和 space。

即我想初始化所有地图 m['a', 'a'] m['a', 'b'] ... m['z', 'z' ] 到 1. 有什么简单的方法可以做到这一点吗?

如果有帮助,我正在尝试解密使用替换密码加密的消息,并且我必须为所有字母对创建双字母组。

尝试做这样的事情:

for(char i = 'a'; i<='z'; i++){
    for(char j = 'a'; j<='z'; j++){
        m.insert(make_pair(make_pair(i,j),1));
    }
}
for (char i = 'a'; i <= 'z'; ++i){
    for (char j = 'a'; j <= 'z'; ++j){
        m[std::make_pair(i, j)] = 1;
    }
}

至少为了清楚起见,很难改进。

要处理 'a''z' 之间存在其他字符的棘手情况(至于 EBCDIC),您可以这样做:

std::map<std::pair<char, char>, double> m;
const auto letters = {
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
};
for (auto c1 : letters) {
    for (auto c2 : letters) {
        m.emplace(std::make_pair(c1, c2), 1.);
    }
}

Demo

Boost 允许 letters:

的初始化
const auto letters = "abcdefghijklmnopqrstuvwxyz"
                     | boost::adaptors::sliced(0, 26); // remove trailling '[=11=]'

Demo