使用substr查找附近的字符

时间:2016-01-11 21:12:29

标签: c++ splice

所以我试图在距离我正在迭代的每个角色的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。

1 个答案:

答案 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>

更好的是将startend作为word的迭代器的版本 - 此时您根本不需要创建子串 < / em>(您只需查看原始单词中的字符)。