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

-       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;
}
0
Evorlor 1 Мар 2015 в 20:28

2 ответа

Лучший ответ

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

map = new HashElement*[size];

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

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

map = new HashElement*[size]();
                            ^^
1
emlai 1 Мар 2015 в 17:37
map = new HashElement*[size];

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

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

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

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

1
Sam Varshavchik 1 Мар 2015 в 17:38