以下trie代码中发生了什么

时间:2014-04-02 01:04:53

标签: c++ algorithm trie

我正在查看Trie的这个example,我很难理解以下代码

void Trie::addWord(string word)
{
    Node * currentNode = root;

    for (int i = 0; i < word.size(); ++i)
    {
        char currentChar = tolower(word.at(i));
        int index = currentChar - 'a';
        assert(index >= 0);     // Makes sure the character is between a-z
        if (currentNode->children[index] != NULL)
        {
            // check if the current node has the current character as one of its decendants
            currentNode = currentNode->children[index];
        }
        else
        {
            // the current node doesn't have the current character as one of its decendants
            Node * newNode = new Node(currentChar);
            currentNode->children[index] = newNode;
            currentNode = newNode;
        }
        if (i == word.size() - 1)
        {
            // the last character of the word has been reached
            currentNode->end = true;
        }
    }
}

我的问题是为什么a在此被删除

 int index = currentChar - 'a';

4 个答案:

答案 0 :(得分:2)

int index = currentChar - 'a';currentChar(它是什么)将被“a”字符减去,其中ASCII值为97.
在这种情况下,您有两个条件:

  1. 首先如果currentChar介于a-z之间,index的结果将始终为>= 0

  2. 否则currentChar不在az之间,因为index将为负数,因为A-Z函数,currentChar不能介于tolower()之间。

  3. 您可以重新考虑此link以了解有关ASCII值的更多信息

    此外,您需要更新条件assert(index >= 0 && index < 26),因为{,},|和〜将使索引&gt; = 0

答案 1 :(得分:1)

它会以字母表的形式给出字母位置,将a视为位置0。这里a被转换为其ASCII码,并且从a-z字母开始,它更容易处理。

答案 2 :(得分:1)

人们往往会忘记 - 一个字符是一个带有ascii值的字节。

所以&#39; a&#39;在ascii表中是97(我认为),所以一切都在完成 - 是currentChar-97。

请按http://www.asciitable.com获取实际值。

但总是记住 - char是一个字节,你可以使用这个事实很多!
我用它来跳过指针中的内存地址(例如:

void* a = (void*)((char*)arr+2);

此代码将返回arr +两个字节的内存,而忽略arr中保存的类型)

请注意 - |&#39; a&#39; - &#39; A&#39; | = |&#39; A&#39; - &#39; a&#39; | ,但是一个是负面的,而另一个是积极的

答案 3 :(得分:0)

int index = currentChar - &#39; a&#39 ;;这是检查字符,因为用户可以输入不在a到z之间的字符。