Очевидное решение - просто дублировать ключевую часть и использовать
std::unordered_map
; для небольшого локального использования это самый простой и
предпочтительное решение, но нет ничего, обеспечивающего инвариант
key == mapped.key_part
, что усложняет поддержку кода при
вставки могут происходить в нескольких местах кода.
Если вы держите на карте указатели, а не значения, вы можете
оберните карту, чтобы ключ был указателем на соответствующий
поле в значении. Проблема с этим, конечно, в том, что это означает
сохраняя указатели, а не значения.
Если вы не измените значения, как только они появятся на карте, вы можете просто использовать
std::set
, а не std::map
, с соответствующим хешем и
функция равенства. Если вы сделаете это, вам, вероятно, придется построить
фиктивный Person
объект для доступа к данным.
Если вы хотите изменить значения (конечно, за исключением ключа), тогда
у вас есть проблема, что std::set
предоставляет только const
доступ к его
члены. Вы можете обойти это, используя const_cast
, но это ужасно.
(И подвержен ошибкам; как убедиться, что фактическая ключевая часть не
изменено.)
Ни одно из этих решений не является полностью удовлетворительным. В таком случае, как твой,
где нет изменяемого доступа к ключевой части (имени), я бы, наверное,
используйте одно из первых двух решений, обернув unordered_map
в
мой собственный класс, чтобы обеспечить сохранение инвариантов.