Хэш-карта векторов, проверка ключа диапазона

Учитывая unordered_map<vector<T*>,V> с соответствующей хеш-функцией, можно ли проверить существование значения ключа в форме span<T*> без предварительного преобразования его в вектор (и выделения кучи памяти)? Мы можем предположить, что размеры всех ключей (как векторов, так и диапазонов) равны, но неизвестны во время компиляции.

Лучшее, что я могу придумать, — это создать хэш-набор set<int64_t> хэш-значений на карте, вычислить хэш диапазона и преобразовать его в вектор только в том случае, если его хэш существует. Но все это кажется довольно громоздким, учитывая, что span содержит всю информацию, необходимую в этом случае.

Я тоже был бы рад, если бы мы нашли какой-нибудь альтернативный тип ключа для карты, который работает с интервалами. Черт возьми, может быть, unordered_map<span<T*>,pair<vector<T*>,V>> работает, где ключ диапазона фактически хранит указатель данных и размер соответствующего ему вектора значений?

это не имеет особого смысла, поскольку ключи карт являются константами, и их порядок\хеш или содержимое не могут быть изменены. Обычно это момент, когда вводится суррогатный ключ.

Swift - Friday Pie 13.06.2024 08:32

можно ли проверить существование значения ключа в виде span<T*> без предварительного преобразования его в вектор (и выделения кучи памяти)? Я бы поискал прозрачный хеш-ключ.

Scheff's Cat 13.06.2024 08:35

Прозрачный хеш-ключ — это именно то, что я искал, спасибо!

HolKann 13.06.2024 09:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужен прозрачный хеш (и равенство) для вашей карты. Поскольку вы можете создать std::span из std::vector, вам нужно реализовать его только для std::span<T*>. Вам придется использовать find вместо operator[] или at до C++26.

struct hash_span {
    using is_transparent = void;
    std::size_t operator()(std::span<T*> data) { /* existing code here */ }
};

struct equal_span {
    using is_transparent = void;
    bool operator()(std::span<T*> lhs, std::span<T*> rhs) { /* existing code here */  }
};

Который затем используется как unordered_map<vector<T*>, V, hash_span, equal_span>.

возможно, вы можете использовать std::reference_wrapperstd::span<T*> в качестве ключа в unordered_map.

std::unordered_map<std::reference_wrapper<std::span<T*>>, int> map;
  • Плюсы: исключает необходимость использования специального компаратора равенства и пользовательского хеш-функция для std::span<T*>
  • Минусы: Представляет std::reference_wrapper, который может быть менее интуитивным и потенциально менее эффективен из-за косвенности.

В моем случае карта должна владеть своими ключами. Поэтому понадобится vector<T*> или какой-то специальный ключ. Тем не менее, спасибо за предложение.

HolKann 13.06.2024 15:13

Другие вопросы по теме

Похожие вопросы

Разумно ли использовать RAII для управления файлами?
Box2D: Обнаружено предупреждение C6262: «Функция использует стек размером 103820 байт. Рассмотрите возможность перемещения некоторых данных в кучу». на главной()
Hashmap с использованием неправильной реализации двоичного дерева поиска?
Использование ifstream/ofstream с Visual Studio. ofstream выводит только последний введенный пароль вместо пароля для конкретной учетной записи
Пользовательский тип C++ из модуля QML не определен при использовании внутри файла QML
Почему я получаю 256-битную арифметическую ошибку: «unsigned _BitInt с битами больше 128 не поддерживается» в C++23, Clang-18?
Как синхронизировать глобальный объект между двумя потоками в C++?
Как работает внешняя переменная __ImageBase?
Самый эффективный способ проверить, является ли положительное целое число 2^n (т.е. 1, 2, 4, 8 и т. д.) в C++20?
Почему Clang запрещает использование квалификаторов в анонимных битовых полях?