В основном мой вопрос такой же, как Intersection of two STL maps, но с двумя unordered_maps
:Пересечение двух unordered_maps
std::unordered_map<Key, Value> A;
std::unordered_map<Key, Value> B;
Я хотел бы получить перекресток, нечто похожее на
std::unordered_map<Key, std::pair<Value, Value>> C;
где ключи значения как в A, так и в B, а значение представляет собой пару значений из A и B соответственно.
Каков самый быстрый способ достичь этого? В настоящее время я перебираю самый маленький из них и запрашиваю ключ во втором. К счастью, мой ключевой тип довольно прост для хэша, но я не нашел способ получить хэш-значение моего ключа итерированной карты, чтобы избавиться от вычисления хеша для второго (яснее: я не знаю как восстановить хэш без повторного его повторения и найти что-то вроде find
с вычисленным хэшем в качестве аргумента [1]).
Спасибо.
[1] Да, я знаю, ранняя оптимизация - это корень многих болезней. Тем не менее, я хотел бы знать, возможно ли это, а не объяснение того, как это может быть проблема с ошибками. И фактически, в некоторых случаях, в зависимости от пользовательского ввода, клавиши могут быть сложными и дорогостоящими для хеша.
Это проще и, возможно, быстрее, если вы заказали 'map'. – dyp
Можете ли вы кэшировать хэш-значение в своем классе? В вашей хеш-функции вы могли бы проверить, был ли уже вычислен хэш и вернуть его. Не забудьте повторно вычислить сохраненный хеш, если какая-либо из клавиш изменится. – Alan
@ Алан: Да, я подумал об этом, но я бы хотел этого избежать. – akim