Я предлагаю лучше использовать std::unordered_map
, а не std::map
, если вы не заботитесь о заказе.Это не только оптимально, но и менее подвержено ошибкам.В случае реализации компаратора вам необходимо убедиться, что Message m1
больше Message m2
и Message m2
больше Message m3
, тогда Message m1
больше Message m3
.(упомяну, поскольку это не было понятно из вашего определения).
Вы можете использовать MessageDifferencer в качестве замены std:equal_to
.См. Также ответы по адресу Сравнение буферов протокола Google
Однако, поскольку вы правильно указали, что эквивалента std::hash
нет, вам потребуется предоставить собственную хэш-функцию.Пожалуйста, обратитесь к PR-2066 и PR-2304 , которые обсуждают об этой отсутствующей функциональности.
Из запроса на получение цитирование xfxyjwf :
Не очень хорошая идея использовать прото-сообщение в качестве ключей, потому что они не являются типами истинных значений.При наличии неизвестных полей два одинаковых сообщения в одном двоичном файле могут рассматриваться как разные другим, и, следовательно, два разных двоичных файла могут получить два разных unordered_map <> даже при одинаковых входных данных (если хеш-функция реализована с использованием MessageDifferencer),Вероятно, лучше написать свою собственную хеш-функцию, которая имеет желаемое поведение, а не отвечать на универсальную.
Если у вас нет неизвестных полей, универсальная хеш-функция должна работать нормально.