Spec-Zone.ru › Ada 2005
Справочник Ada 2005

A.18.5 Пакет Containers.Hashed_Maps

Статическая семантика

В библиотечном пакете Containers.Hashed_Maps определены следующие элементы:
generic
type Key_Type is private;
type Element_Type is private;
with function Hash (Key : Key_Type) return Hash_Type;
with function Equivalent_Keys (Left, Right : Key_Type)
return Boolean;
with function "=" (Left, Right : Element_Type)
return Boolean is <>;
package Ada.Containers.Hashed_Maps is
pragma Preelaborate(Hashed_Maps);
type Map is tagged private;
pragma Preelaborable_Initialization(Map);
type Cursor is private;
pragma Preelaborable_Initialization(Cursor);
Empty_Map : constant Map;
No_Element : constant Cursor;
function "=" (Left, Right : Map) return Boolean;
function Capacity (Container : Map) return Count_Type;
procedure Reserve_Capacity (Container : in out Map;
Capacity : in Count_Type);
function Length (Container : Map) return Count_Type;
function Is_Empty (Container : Map) return Boolean;
procedure Clear (Container : in out Map);
function Key (Position : Cursor) return Key_Type;
function Element (Position : Cursor) return Element_Type;
procedure Replace_Element (Container : in out Map;
Position : in Cursor;
New_Item : in Element_Type);
procedure Query_Element
(Position : in Cursor;
Process : not null access procedure (Key : in Key_Type;
Element : in Element_Type));
procedure Update_Element
(Container : in out Map;
Position : in Cursor;
Process : not null access procedure
(Key : in Key_Type;
Element : in out Element_Type));
procedure Move (Target : in out Map;
Source : in out Map);
procedure Insert (Container : in out Map;
Key : in Key_Type;
New_Item : in Element_Type;
Position : out Cursor;
Inserted : out Boolean);
procedure Insert (Container : in out Map;
Key : in Key_Type;
Position : out Cursor;
Inserted : out Boolean);
procedure Insert (Container : in out Map;
Key : in Key_Type;
New_Item : in Element_Type);
procedure Include (Container : in out Map;
Key : in Key_Type;
New_Item : in Element_Type);
procedure Replace (Container : in out Map;
Key : in Key_Type;
New_Item : in Element_Type);
procedure Exclude (Container : in out Map;
Key : in Key_Type);
procedure Delete (Container : in out Map;
Key : in Key_Type);
procedure Delete (Container : in out Map;
Position : in out Cursor);
function First (Container : Map)
return Cursor;
function Next (Position : Cursor) return Cursor;
procedure Next (Position : in out Cursor);
function Find (Container : Map;
Key : Key_Type)
return Cursor;
function Element (Container : Map;
Key : Key_Type)
return Element_Type;
function Contains (Container : Map;
Key : Key_Type) return Boolean;
function Has_Element (Position : Cursor) return Boolean;
function Equivalent_Keys (Left, Right : Cursor)
return Boolean;
function Equivalent_Keys (Left : Cursor;
Right : Key_Type)
return Boolean;
function Equivalent_Keys (Left : Key_Type;
Right : Cursor)
return Boolean;
procedure Iterate
(Container : in Map;
Process : not null access procedure (Position : in Cursor));
private
... -- не определено языком
end Ada.Containers.Hashed_Maps;
Объект типа Map содержит расширяемую хеш-таблицу, обеспечивающую прямой доступ к узлам. Ёмкость объекта типа Map — это максимальное количество узлов, которые могут быть вставлены в хеш-таблицу до её автоматического расширения.
Два ключа K1 и K2 считаются эквивалентными, если Equivalent_Keys (K1, K2) возвращает True.
Реализация функции Hash должна возвращать одно и то же значение при каждом вызове с определённым значением ключа. Для любых двух эквивалентных значений ключа фактическая функция Hash должна возвращать одно и то же значение. Если поведение Hash отличается, поведение этого пакета неопределено. Какие подпрограммы этого пакета вызывают Hash и сколько раз — неопределено.
Реализация функции Equivalent_Keys должна возвращать одно и то же значение при каждом вызове с определённой парой значений ключей. Она должна определять отношение эквивалентности, то есть быть рефлексивной, симметричной и транзитивной. Если поведение Equivalent_Keys отличается, поведение этого пакета неопределено. Какие подпрограммы этого пакета вызывают Equivalent_Keys и сколько раз — неопределено.
Если значение ключа, хранящегося в узле карты, изменено каким-либо способом, отличным от операций этого пакета, так что значения Hash или Equivalent_Keys меняются, поведение этого пакета неопределено.
Порядок узлов (первый, последний, следующий) в карте, кроме общей семантики, описанной в A.18.4, неопределён.
function Capacity (Container : Map) return Count_Type;
Возвращает ёмкость Container.
procedure Reserve_Capacity (Container : in out Map;
Capacity : in Count_Type);
Reserve_Capacity выделяет новую хеш-таблицу так, что длина полученной карты может стать не менее Capacity без дополнительного вызова Reserve_Capacity и достаточно велика для хранения текущей длины Container. После этого Reserve_Capacity перераспределяет узлы Container в новую хеш-таблицу. Она заменяет старую хеш-таблицу новой и освобождает старую. Любое исключение, возникшее во время выделения, распространяется, а Container не изменяется.
Reserve_Capacity может повлиять на курсоры Container.
procedure Clear (Container : in out Map);
В дополнение к семантике, описанной в A.18.4, Clear не влияет на ёмкость Container.
procedure Insert (Container : in out Map;
Key : in Key_Type;
New_Item : in Element_Type;
Position : out Cursor;
Inserted : out Boolean);
В дополнение к семантике, описанной в A.18.4, если Length (Container) равно Capacity (Container), то Insert сначала вызывает Reserve_Capacity, чтобы увеличить ёмкость Container до некоторого большего значения.
function Equivalent_Keys (Left, Right : Cursor)
return Boolean;
Эквивалентно Equivalent_Keys (Key (Left), Key (Right)).
function Equivalent_Keys (Left : Cursor;
Right : Key_Type) return Boolean;
Эквивалентно Equivalent_Keys (Key (Left), Right).
function Equivalent_Keys (Left : Key_Type;
Right : Cursor) return Boolean;
Эквивалентно Equivalent_Keys (Left, Key (Right)).

Рекомендации по реализации

Если N — длина карты, средняя временная сложность подпрограмм Element, Insert, Include, Replace, Delete, Exclude и Find, принимающих параметр ключа, должна быть O(log N). Средняя временная сложность подпрограмм, принимающих параметр курсора, должна быть O(1). Средняя временная сложность Reserve_Capacity должна быть O(N).


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API