Ada中是否预先实现了"字典"类型?以及如何使用它?

Mas*_*r_T 4 dictionary ada data-structures

我试图找出标准的Ada库是否配备了"字典"类型(我的意思是:一种数据结构,以一种<key, value>格式存储值,我可以value通过使用相应的唯一来检索a key).

这样的数据结构是否存在?如果是这样,有人可以提供如何填充和查询它的工作示例吗?

我尝试在Google上搜索,但它只是提供了数百个定义"ada"一词的在线词典结果.

Sim*_*ght 8

词典的另一个词是Map; Map提供从键到值的映射.

Ada.Containers有两种不同的Map,Hashed和Ordered.对于散列地图,给您提供的密钥类型的哈希函数,而对于有序地图你提供一个比较函数"<"来定义的顺序.

除此之外,这些类型中的每一种都有两种形式,明确的和不确定的.定类型,广义地说,是其中编译器知道的类型的对象的大小,以便它可以保留在容器中的空间中的正确量为包含的对象被直接存储 - 如Integer - 而对于不定类型,例如作为String,运行时大小可以从实例更改为实例,因此Container必须在后台使用动态分配.

我需要计算输入命名子程序的次数,并以此为基础:

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);
Run Code Online (Sandbox Code Playgroud)

(Natural由于标准"="是默认的,因此无需提供相等操作).

我宣布地图:

Saved_Entries : String_To_Count_Maps.Map;
Run Code Online (Sandbox Code Playgroud)

然后我就可以增加当前计数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;
Run Code Online (Sandbox Code Playgroud)

用于提取当前计数的代码类似地考虑到尚未存在任何"增量"的情况.

(a)你会注意到,因为Map是标记类型而Cursor不是,我可以说Saved_Entries.Replace_Element (...),但不是C.Element + 1.这很烦人,但我被告知有原因.