2

Мне нужно предоставить интерфейс вставки/поиска/удаления для хэш-таблицы. Я написал хеш-таблицу только для обеспечения внутреннего управления ведром/записью. Хеш-функцию следует подавать снаружи. Я теперь зациклился на том, как выставить интерфейс, чтобы хэш-таблица могла обрабатывать массивы байтов, а также типы данных фиксированной длины. Проблема в том, что для массивов байтов хеш-функция должна знать длину массива, а для других типов - без этой информации. Мои проблемы состоят в том, что я не могу реализовать operator[] для байтовых массивов, потому что для функции хэша нужны два параметра. И я бы очень хотел поддерживать operator[]. Есть ли способ обойти это (не специализируясь на T* и бросая ошибку компилятора для operator[] в этой специализации.)?О шаблоне специализации

ответ

1

Я запутался здесь, потому что я не понимаю, где оператор [] на хеш-таблице конфликтует с оператором [] над типом данных, который вы храните в нем.

Если ваш hash_table имеет оператор [], это может быть либо hash_map, где вы предоставляете ключ оператору [], либо может быть, что оператор [] возвращает вам содержимое ячейки.

Обычно, если я реализую свою собственную таблицу хэша, я непосредственно не храню данные в записях, кроме данных, а также некоторые «метаданные», то есть информацию, относящуюся к ячейке. Поскольку ваша хеш-таблица поддерживает удаление, вам необходимо убедиться, что вы все равно можете столкнуться с любыми столкновениями, которые предположительно были перемещены в другом месте, независимо от того, какая ваша стратегия теперь предназначена для поиска такой ячейки. Таким образом, удаленная ячейка доступна, но имеет другое значение для того, который никогда не был занят, поскольку это может быть частью пути в курсе столкновения.

Хеш-функция независима, как вы говорите. Поэтому он независим от механизма хранения и не вызывает оператора [] хэш-таблицы вообще.

Хэш-таблица использует только хеш-функцию и функцию сравнения, а в противном случае использует собственную политику хранения и политику обработки конфликтов.

+0

+1. Я думаю, хэш-таблица не должна знать о байтовой компоновке ключа. Я буду применять класс-оболочку для ключей массива байтов. – nakiya

0

может обрабатывать массивы байтов, а также типы данных фиксированной длины

Таким образом, ваши массивы байтов различаются по размеру. Вам нужно будет записать длину каждого из них. Если вы хотите сохранить их в хеш-таблице по значению, то вы можете упаковать данные и значение длины в объект: STL уже предоставляет некоторые классы, подходящие для этого, включая std :: vector <> и std :: string < >. В качестве альтернативы, если вы хотите, чтобы хэш-таблица сохраняла указатели/ссылки на ваши байтовые массивы, вы можете создать тривиальный класс «дескриптор», который либо хранит, либо знает, где найти длину, и имеет указатель/ссылку на данные.

Как указывает «CashCow», внутри байтового массива нет врожденного конфликта между operator[] и что на хэш-таблице ... они могут быть даже прикованы, если необходимо.

Смежные вопросы