字典的另一个词是地图; Map 提供从键到值的映射。
Ada.Containers 有两种不同的 Map,Hashed 和 Ordered。对于 Hashed map,您提供 Key 类型的哈希函数,而对于 Ordered map,您提供比较函数“
除此之外,这些类型中的每一种都有两种形式,确定的和不确定的。从广义上讲,确定类型是编译器知道该类型对象大小的那些类型,因此它可以在 Container 中保留正确的空间量,以便直接存储包含的对象 - 例如 Integer - 而对于不确定类型,例如作为 String ,运行时大小可以根据实例变化,因此容器必须在后台使用动态分配。
我需要计算一个命名子程序被输入的次数,并以此为基础:
package String_To_Count_Maps
is new Ada.Containers.Indefinite_Hashed_Maps
(Element_Type => Natural,
Key_Type => String,
Hash => Ada.Strings.Hash_Case_Insensitive,
Equivalent_Keys => Ada.Strings.Equal_Case_Insensitive);
(没有必要为Natural 提供相等操作,因为标准的“=”是默认的)。
我声明地图:
Saved_Entries : String_To_Count_Maps.Map;
然后我可以将For_Subprogram_Named 的当前计数增加
...
C : constant String_To_Count_Maps.Cursor :=
Saved_Entries.Find (For_Subprogram_Named);
use type String_To_Count_Maps.Cursor;
begin
if C = String_To_Count_Maps.No_Element then
Saved_Entries.Insert (For_Subprogram_Named, 1);
else
Saved_Entries.Replace_Element
(Position => C,
New_Item => String_To_Count_Maps.Element (C) + 1); -- see (a)
end if;
提取当前计数的代码类似地考虑了还没有任何“增量”的情况。
(a) 你会注意到,因为Map 是标记类型而Cursor 不是,所以我可以说Saved_Entries.Replace_Element (...) 之类的东西,但不能说C.Element + 1。这很烦人,但有人告诉我有原因。