iterator - 容器迭代器的抽象

标签 iterator ada

我在这里谈论的是 Ada 2012。

我先让代码说话:

with Ada.Containers.Hashed_Maps;                                                
with Ada.Strings.Unbounded;                                                     
with Ada.Strings.Unbounded.Hash_Case_Insensitive;                               
with Ada.Strings.Unbounded.Equal_Case_Insensitive;                              

package Environments is                                                         

   type Environment is tagged private;                                          

   function Variable (                                                          
      E    : in Environment;                                                    
      Name : in Ada.Strings.Unbounded.Unbounded_String                          
   )                                                                            
      return Ada.Strings.Unbounded.Unbounded_String                             
      with Inline;                                                              

   procedure Set_Variable (                                                     
      E     : in out Environment;                                               
      Name  : in Ada.Strings.Unbounded.Unbounded_String;                        
      Value : in Ada.Strings.Unbounded.Unbounded_String                         
   )                                                                            
      with Inline;                                                              

private                                                                         

   package Variable_Maps is new Ada.Containers.Hashed_Maps (                    
      Key_Type        => Ada.Strings.Unbounded.Unbounded_String,                
      Element_Type    => Ada.Strings.Unbounded.Unbounded_String,                
      Hash            => Ada.Strings.Unbounded.Hash_Case_Insensitive,           
      Equivalent_Keys => Ada.Strings.Unbounded.Equal_Case_Insensitive,          
      "="             => Ada.Strings.Unbounded."="                              
   );                                                                           

   type Environment is tagged record                                            
      Variables : Variable_Maps.Map;                                            
   end record;                                                                  

end Environments;

我们这里有一个示例包,很好地说明了我的问题。我在 Hashed_Map 中存储了一些环境变量,但我想在标准容器上构建一个抽象层,这样我将来就可以更改底层容器,而无需更改包客户中的任何代码。

获取和设置变量很容易 - 正如上面声明的那样。真正的问题是迭代。我想让我的包的客户能够迭代环境并轻松获取每个元素的键和值。

由于我使用的是 Ada 2012,最好的方法是使用迭代器,但是如何使用呢?我可以将光标返回到底层容器,但同样,该光标的接口(interface)将依赖于容器。

通过标准容器迭代实现此类抽象的最佳方法是什么?

最佳答案

看看 Ada Gems #127#128 ,“Ada 2012 中的迭代器,第 1 部分和第 2 部分”,获取有关如何创建自己的迭代器的指南。

关于iterator - 容器迭代器的抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11793400/

相关文章:

java - 迭代器不打印明确存在的项目是 LinkedList

java - 如何迭代整个 HashMap

ada - "for XXX use"子句对空记录有意义吗?

ada - "use"的使用。它不仅仅消除了对前缀的需要?

c++ - 遍历列表映射?

c++ - 有没有办法将 std::stack<pointer> 转换为 std::stack<const pointer>?

generics - Ada 通用包扩展

c++ - 第三方音频库链接器问题

python - 一个python对象中的双迭代器

types - 是否可以认为 Ada 子类型等同于依赖类型?