如何使用 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.);
}
}
Boost 允许 letters
:
的初始化
const auto letters = "abcdefghijklmnopqrstuvwxyz"
| boost::adaptors::sliced(0, 26); // remove trailling '[=11=]'
我想要做的是将 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.);
}
}
Boost 允许 letters
:
const auto letters = "abcdefghijklmnopqrstuvwxyz"
| boost::adaptors::sliced(0, 26); // remove trailling '[=11=]'