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

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

本文关键字:字符 有可能 何使用 pair 遍历      更新时间:2023-10-16

我要做的是将map<pair<char, char>, double>的所有值初始化为1,其中对中的字符仅由小写字母和空格组成。

即,我想初始化所有映射m[‘a','a']m[‘a’,'b']。。。m['z','z']为1。有什么简单的方法可以做到这一点吗?

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

尝试这样做:

for(char i = 'a'; i<='z'; i++){
    for(char j = 'a'; j<='z'; j++){
        m.insert(make_pair(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.);
    }
}

演示

Boost允许letters:的初始化

const auto letters = "abcdefghijklmnopqrstuvwxyz"
                     | boost::adaptors::sliced(0, 26); // remove trailling ''

演示

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

至少为了清楚起见,情况将很难好转。

相关文章: