2015-03-01 5 views
0

Я пытаюсь создать базовую HashMap. Я проверяю, существует ли элемент в индексе перед его вставкой. Когда я вставляю свой первый элемент, он говорит, что элемент уже существует в этой позиции. Я прошел через отладчик, и все мои значения, как и ожидалось, за исключением map[hash]. Я ожидаю nullptr, но это не произойдет. map[hash] имеет следующее значение:Отсутствует nullptr для элемента undeclared array

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

Может кто-то пожалуйста, объясните мне, что я недопонимание? Неожиданный результат: line 21 от HashMap.cpp. Вот соответствующий код:

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; 
} 

ответ

1

map[hash] не nullptr, потому что вы не инициализируются его таковым.

map = new HashElement*[size]; 

Каждый элемент в массиве map будет иметь случайное значение после этой линии.

Чтобы исправить это и инициализировать все элементы, чтобы быть nullptr:

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

Я думаю, что вы можете меня преследуешь ... за мной и отвечать на все мои вопросы ... не остановить: -) – Evorlor

+0

@Evorlor Ха-ха: P – emlai

1
map = new HashElement*[size]; 

Здесь вы инстанцирование массива size указателей, в куче. Насколько я понимаю ваш вопрос, вы предполагаете, что все созданные указатели в этом массиве new будут nullptr.

Это не так. Для «простых старых данных» или POD его содержимое по умолчанию не инициализируется. Вы должны явно инициализировать их:

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

... в конструкторе

+0

Удивительный! Итак, инициализация HashElement до 0 указывает на нуль? – Evorlor

+1

null и 0 - одно и то же. Если вы предпочитаете, вы можете использовать константу константы C++ 11 nullptr. –