Я пытаюсь создать базовую 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;
}
2 ответа
map[hash]
не является nullptr
, потому что вы не инициализировали его таким образом.
map = new HashElement*[size];
Каждый элемент в массиве map
будет иметь случайное значение после этой строки.
Чтобы исправить это и инициализировать все элементы как nullptr
:
map = new HashElement*[size]();
^^
map = new HashElement*[size];
Здесь вы создаете экземпляр массива указателей size
в куче. Насколько я понимаю ваш вопрос, вы предполагаете, что все созданные указатели в этом массиве new
будут nullptr
.
Это не относится к делу. Для "простых старых данных" или POD
их содержимое по умолчанию не инициализируется. Вам нужно будет явно инициализировать их:
for (size_t i=0; i<size; ++i)
map[i]=0;
... в конструкторе
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .