【问题标题】:How do I iterate through all possible pairs of characters using pair?如何使用pair遍历所有可能的字符对?
【发布时间】:2016-04-13 06:15:28
【问题描述】:

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

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

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

【问题讨论】:

  • 使用 2 个 for 循环。在这里寻找最简单的解决方案。

标签: c++ dictionary std-pair


【解决方案1】:

尝试做这样的事情:

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

【讨论】:

  • 几天前,我还使用 [] 运算符来初始化 map 中的成员,其中 struct 只有一个参数化的构造函数。它导致了一些错误,从那时起我更喜欢使用这种方式。
  • 哼。那很有意思。这本身就是一个问题。
【解决方案2】:

要处理在'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 '\0'

Demo

【讨论】:

  • 非常彻底。 OP 应该代替我接受这个答案。
【解决方案3】:
for (char i = 'a'; i <= 'z'; ++i){
    for (char j = 'a'; j <= 'z'; ++j){
        m[std::make_pair(i, j)] = 1;
    }
}

至少为了清晰起见,将很难变得更好。

【讨论】:

  • 没有人说'a''z' 之间可能有非小写字符en.wikipedia.org/wiki/EBCDIC :-)
  • @Jarod42:一个全面的答案将被大力支持。所有你的;-)
  • 我添加了它,想知道如何使初始化更清洁顺便说一句,使用boostDemo 好一点,但是很重的工具:-/。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 2012-10-19
  • 2013-05-04
  • 2013-01-17
相关资源
最近更新 更多