О шаблонной специализации - PullRequest
2 голосов
/ 19 января 2011

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

Ответы [ 2 ]

1 голос
/ 19 января 2011

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

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

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

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

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

0 голосов
/ 19 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...