所以我试图在距离我正在迭代的每个角色的X个距离内找到角色。所以举个例子......
nearby("abcdefg", 2)
应该返回一个集合,每个字符作为一个键,其值在2的距离内。它应该看起来像......
dictionary('a' -> set(a, b, c), 'b' -> set(a, b, c, d), 'c' -> set(a,b,c,d,e))
我的代码现在看起来像这样......
dictionary<char, set<char>> near(const std::string word, int dist) {
dictionary<char, set<char>> map;
for (int x = 0; x < word.size(); x++) {
for (char letter : word.substr(std::max(0, x - dist), std::min(dist + 1, int(word.size()))))
map[word[x]].insert(letter);
}
return map;
}
问题大纲: - 它在很大程度上起作用,但是,由于C ++的子字符串,我不能指定我想要从索引0到4的所有字符。相反,它索引为0,然后包括范围为4的任何内容。这是有问题的当我想倒退时,在前面的和中添加4个字母。
截至目前,我的代码是正确的,但最后会留下一个字符。所以它看起来像这样......
nearby(abcdefg, 2)
dictionary('c' -> set(a,b,c))
它遗漏了d。
答案 0 :(得分:1)
你只需要:
const auto start = std::max(0, x-dist);
const auto end = std::min(x+dist+1, int(word.size());
const auto len = end - start;
const auto substring = word.substr(start,len);
auto &the_set = map[word[x]];
for (const auto letter : substring)
the_set.insert(letter);
如评论中所述,如果word.size()
&gt;这将会中断INT_MAX
。解决方案是在size_t
中执行所有操作(您可以在std::string::size_t
中完成所有操作,但这非常冗长,并且不会真正为您买任何东西)。
dictionary<char, set<char>> near(const std::string word, size_t dist) {
dictionary<char, set<char>> map;
for (size_t x = 0; x < word.size(); x++) {
const auto start = (x > dist) ? x-dist : 0; // Beware underflow
const auto end = std::min(x+dist+1, word.size());
const auto len = end - start;
const auto substring = word.substr(start,len);
auto &the_set = map[word[x]];
for (const auto letter : substring)
the_set.insert(letter);
}
}
这个版本的优点是gcc会用-Werror -Wall
编译它(之前的版本会抱怨签名/未签名的比较),并且没有演员表(总是一个好的标志)。< / p>
更好的是将start
和end
作为word
的迭代器的版本 - 此时您根本不需要创建子串 < / em>(您只需查看原始单词中的字符)。