Сбой Google плотного_hash_map в функции set_empty_key () - PullRequest
7 голосов
/ 25 мая 2011

Я пытаюсь использовать google density_hash_map для хранения данных значения ключа вместо std: map.

Когда я тестировал с парой (int, int), я установил set_empty_key (mymap, -2), и это сработало.

Но теперь, когда я использую его с моей парой (hash, value), я устанавливаю set_empty_key (mymap -2) или set_empty_key (mymap, some_random_hash), в обоих случаях моя программа падает в set_empty_key ();.

Кто-нибудь может мне помочь с этим?Как я могу исправить этот сбой?

Спасибо.

1 Ответ

8 голосов
/ 03 июля 2011

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

Сначала.Убедитесь, что оба типа key_type и data_type являются типами POD и не содержат указателей на себя.Более конкретно ( original ):

И key_type, и data_type должны быть обычными старыми данными.Кроме того, не должно быть структур данных, которые указывают непосредственно на части ключа или значения, включая сам ключ или значение (например, у вас не может быть значения, такого как struct {int a = 1, * b = & a}. Этопотому что dens_hash_map использует malloc () и free (), чтобы выделить место для ключа и значения, и memmove (), чтобы реорганизовать ключ и значение в памяти.

Во-вторых. Что касается использования dens_hash_map. Вам необходимоустановите специальное «пустое» значение ключа, которое никогда не будет использоваться для реальных элементов, хранящихся в вашей коллекции.Кроме того, если вы собираетесь использовать erase(), вам нужно указать специальный ключ для удаленных элементов, который также никогда не будет использоваться в качестве ключа длянастоящие сохраненные элементы. Это прекрасно описано здесь :

dens_hash_map требует, чтобы вы вызывали set_empty_key () сразу после создания hash-map и перед вызовом любого другого метода density_hash_map.это наибольшая разница между API-интерфейсом density_hash_map и другими API-интерфейсами хэш-карт.ion.html, почему это необходимо.) Аргументом set_empty_key () должно быть значение ключа, которое никогда не используется для допустимых записей хэш-карты.Если у вас нет такого значения ключа, вы не сможете использовать dens_hash_map.Ошибка вызывать insert () с элементом, ключ которого является «пустым ключом».Плотная_карта_hash также требует, чтобы вы вызывали set_deleted_key () перед вызовом erase ().Аргумент для set_deleted_key () должен быть ключом-значением, которое никогда не используется для допустимых записей хэш-карты.Он должен отличаться от значения ключа, используемого для set_empty_key ().Ошибка вызова erase () без предварительного вызова set_deleted_key (), а также ошибка вызова insert () с элементом, ключ которого является «удаленным ключом».

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