Почему происходит сбой этого кода с использованием указателей на карте c ++ в этой реализации Trie? - PullRequest
0 голосов
/ 14 мая 2018
#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;
}

Вылетает при вставке с использованием набора следующего узла. любая помощь? И лучше ли использовать в этом случае указатели или поместить объект на карту?

1 Ответ

0 голосов
/ 14 мая 2018

Проблема в том, что ваш код выполняет неправильное сравнение, чтобы увидеть, существует ли элемент на карте.

Это:

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

должно быть:

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

Используя неправильное сравнение, вы получаете неинициализированный указатель.


Это также демонстрирует, что комментарии могут лгать о том, что делает код - единственное, что является правдой, это код. Я имею в виду этот комментарий прямо перед неправильным кодом:

/// character is not in the map

и, конечно, код не определяет, нет ли символа на карте. Это фактически проверяет, является ли символ на карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...