为什么此代码在此 Trie 实现中使用映射 c++ 中的指针崩溃?

Why does this code crash using pointers in map c++ in this implementation of Trie?

本文关键字:c++ 崩溃 映射 指针 代码 Trie 实现 为什么      更新时间:2023-10-16
#include <iostream>
#include <vector>
#include <map>
#include <utility>
#include <iterator>
using namespace std;
class Node
{
public:
map<char,Node*> characters;
bool endOfWord = false;
Node()
{
}
Node(bool endOfWordBool)
{
this->endOfWord = endOfWordBool;
}
};
class Trie
{
public:
Node* root = nullptr;
Trie()
{
this->root = new Node();
}

这个函数是这里的问题。 使用我在每次迭代中设置的下一个节点崩溃,映射 stl 是否不支持具有指向内部对象的指针?

void insertWord(string word)
{
Node* currentNode = this->root;
for(unsigned int i = 0; i < word.length(); i++)
{
/// character is not in the map
if(currentNode->characters.find(word[i]) != 
currentNode->characters.end())
{
cout << "before create" << endl;
Node* nextNode = new Node();
currentNode->characters.insert(pair<char,Node*>(word[i], 
nextNode));
currentNode = currentNode->characters.find(word[i])->second;
}
/// character is in the map
else
{
currentNode = currentNode->characters.find(word[i])->second;
}
}
currentNode->endOfWord = true;
}
};
int main()
{
Trie* t = new Trie();
string s = "ahmed";
t->insertWord(s);
return 0;
}

它使用设置的下一个节点在插入中崩溃。 有什么帮助吗?在这种情况下使用指针或将对象放在地图中是否更好?

问题是您的代码进行了错误的比较以查看映射中的元素是否存在。

这:

if (currentNode->characters.find(word[i]) != currentNode->characters.end())

应该是:

if (currentNode->characters.find(word[i]) == currentNode->characters.end())

通过使用错误的比较,您最终会使用未初始化的指针。


这也表明注释可以掩盖代码的作用 - 唯一真实的是代码。 我指的是不正确代码之前的这条评论:

/// character is not in the map

当然,代码并不能确定该字符是否不在地图中。 它实际上测试角色是否地图中。