Будет ли значение хеш-карты Ады того же ключа будет перезаписано - PullRequest
0 голосов
/ 24 сентября 2018

В Ada, если я использую команду вставки с ключом, который уже существует в хешированной карте, он просто обновит значение, сохраненное с этим ключом?Вот спецификация Ada 2005 пакета Hashed_Maps: http://www.adaic.org/resources/add_content/standards/05rm/html/RM-A-18-5.html
Спасибо

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Этот ответ правильный, но зависит от того, какой Insert вы используете.Их несколько ( ARM A.18.4 (44ff) );если вы используете простой

procedure Insert (Container : in out Map;
                  Key       : in     Key_Type;
                  New_Item  : in     Element_Type);

, то он

вставляет Key и New_Item в контейнер согласно вставке из пяти параметров, с той разницей, что если узел с ключом, эквивалентным Key, уже находится на карте, то распространяется Constraint_Error .

0 голосов
/ 24 сентября 2018

Читая о Insert процедурах, предусмотренных Hashed_Maps, также обращайтесь к документации подпрограмм, общих для всех Maps.В частности, обратите внимание на параметр out типа Boolean:

Если совпадение найдено, Inserted устанавливается на False, а Position обозначает элемент с соответствующим ключом.В противном случае Insert выделяет новый узел, инициализирует его для Key и New_Item и добавляет его к Container;Inserted установлен на True, а Position обозначает вновь вставленный узел.

После Insert существующая пара ключ / элемент не изменится,но вы можете Replace соответствующий элемент ключа, если этого требует ваш сценарий использования, например, чтобы увеличить количество раз, когда встречается конкретный ключ.

В этом связанном примере процедураRead_Dictionary отображает каждое словарное слово (ключ) в набор слов (элемент).В цикле процедура проверяет Inserted, чтобы определить, следует ли обновить новый или существующий набор.

Word_Map.Insert(Sorted, Position, Inserted);
if Inserted then
   Set := new ACOS.Set;
   Word_Map.Replace_Element(Position, Set);
else
   Set := ACHM.Element(Position);
end if;
Set.Insert(Word);
...