我试图找出标准的Ada图书馆是否配备了一本&#34;字典&#34; type(我的意思是:一种数据结构,以<key, value>
格式存储值,我可以使用相应的唯一value
从中检索key
。
这种数据结构是否存在?如果是这样,有人可以提供一个如何填充和查询它的工作示例吗?
我尝试在Google上进行搜索,但它只是提供了数百个来自在线词典的结果,这些结果定义了“&#34; ada&#34;”。
答案 0 :(得分:8)
词典的另一个词是Map; Map提供从键到值的映射。
Ada.Containers有两种不同的Map,Hashed和Ordered。对于Hashed贴图,您在Key类型上提供散列函数,而对于Ordered贴图,您提供比较函数“&lt;”来定义订单。
除此之外,这些类型中的每一种都有两种形式,明确的和不确定的。广义上,定义类型是编译器知道类型对象大小的类型,因此它可以在Container中保留正确的空间量,以便直接存储所包含的对象 - 例如整数 - 而对于不定类型,例如作为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);
(没有必要为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
。这很烦人,但我被告知有原因。