【问题标题】:Is there a "dictionary" type pre-implemented in Ada? And how to use it?Ada 中是否预先实现了“字典”类型?以及如何使用它?
【发布时间】:2014-07-23 17:35:17
【问题描述】:

我试图找出标准 Ada 库是否配备了“字典”类型(我的意思是:一种以 <key, value> 格式存储值的数据结构,我可以从中检索 value使用对应的唯一key)。

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

我尝试在 Google 上搜索,但它只从在线词典中找到数百个定义“ada”一词的结果。

【问题讨论】:

标签: dictionary data-structures ada


【解决方案1】:

字典的另一个词是地图; 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。这很烦人,但有人告诉我有原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-03-13
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 2017-06-15
    相关资源
    最近更新 更多