我正在查看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';
答案 0 :(得分:2)
在int index = currentChar - 'a';
行currentChar
(它是什么)将被“a”字符减去,其中ASCII
值为97.
在这种情况下,您有两个条件:
首先如果currentChar
介于a-z之间,index
的结果将始终为>= 0
。
否则currentChar
不在az之间,因为index
将为负数,因为A-Z
函数,currentChar不能介于tolower()
之间。
您可以重新考虑此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之间的字符。