2015-03-01 1 views
0

J'essaie de créer une HashMap de base. Je vérifie pour voir si un élément existe à un index avant de l'insérer là. Quand j'insère mon premier élément, il est dit qu'un élément existe déjà à cette position. J'ai traversé le débogueur, et toutes mes valeurs sont comme prévu, sauf pour map[hash]. J'anticipe un nullptr, mais ça ne vient pas. map[hash] a la valeur suivante:Absence de nullptr pour élément de tableau non déclaré

-  map[hash] 0xcdcdcdcd {key=??? value={...} next_element=??? } HashElement * 

Quelqu'un peut-il expliquer s'il vous plaît me ce que je suis malentendu? Le résultat inattendu est le line 21 de HashMap.cpp. Voici le code correspondant:

HashMap.h

#pragma once 
#include <string> 

#include "HashElement.h" 

class HashMap 
{ 
private: 
    HashElement **map; 
    int size; 
public: 
    HashMap(int); 
    ~HashMap(); 
    int GetHash(int); 
    void Put(int, std::string); 
}; 

HashMap.cpp

#include "HashMap.h" 

#include <string> 

HashMap::HashMap(int _size) 
{ 
    size = _size; 
    map = new HashElement*[size]; 
} 

HashMap::~HashMap() 
{ 
} 

int HashMap::GetHash(int _key){ 
    return _key % size; 
} 

void HashMap::Put(int _key, std::string _value){ 
    int hash = GetHash(_key); 
    if (!map[hash]){ //Anticipated to be nullptr on first Put, but it skips to else 
     map[hash] = new HashElement(_key, _value); 
    } 
    else{ 
     HashElement *lastElement = map[hash]; 
     while (lastElement->next_element){ 
      lastElement = lastElement->next_element; 
     } 
     lastElement->next_element = new HashElement(_key, _value); 
    } 
} 

HashElement.h

#pragma once 

#include <string> 

class HashElement 
{ 
private: 
    int key; 
    std::string value; 
public: 
    HashElement(int, std::string); 
    ~HashElement(); 
    HashElement *next_element; 
    int get_key(); 
    std::string get_value(); 
}; 

HashElement.cpp

#include "HashElement.h" 

HashElement::HashElement(int _key, std::string _value) 
{ 
    key = _key; 
    value = _value; 
} 

HashElement::~HashElement() 
{ 
} 

int HashElement::get_key(){ 
    return key; 
} 

std::string HashElement::get_value(){ 
    return value; 
} 

Répondre

1

map[hash] est pas un nullptr parce que vous ne l'avez pas initialisé à tel.

map = new HashElement*[size]; 

Chaque élément du tableau map aura une valeur aléatoire après cette ligne.

Pour résoudre ce problème et initialiser tous les éléments pour être nullptr:

map = new HashElement*[size](); 
          ^^ 
+0

Je pense que vous pouvez me ... me traque suivante autour et répondre à toutes mes questions ... Do not stop: -) – Evorlor

+0

@Evorlor Haha: P – emlai

1
map = new HashElement*[size]; 

Ici, vous instanciation un tableau de pointeurs size, sur le tas. Comme je comprends votre question, vous supposez que tous les pointeurs instanciés, dans ce tableau new, seront nullptr.

Ce n'est pas le cas. Pour les "anciennes données", ou POD, son contenu n'est pas initialisé par défaut. Vous devrez les initialiser explicitement:

for (size_t i=0; i<size; ++i) 
    map[i]=0; 

... dans le constructeur

+0

Génial! Donc initialiser un HashElement à 0 le fait pointer sur null? – Evorlor

+1

nul et 0 sont la même chose. Vous pouvez utiliser la constante nullptr C++ 11, si vous préférez. –