定义用于迭代不同容器类型的泛型转换迭代器

Defining a generic transform iterator for iterating over different container types

本文关键字:类型 泛型 转换 迭代器 用于 迭代 定义      更新时间:2023-10-16

我有一个类似下面的类:

class ArraySim{
  public: 
     DataStructure* ds;
     ArraySim(bool which){
        if(true)
           ds = new STDMap();
        else 
           ds = new HashMap();
     }
     value_type& operator[](int idx){
          return ds->getValAtIndex(idx);
     }
     //define a  custom iterator type that can be used to iterate over both std::map and boost::unordered //map keys.
} 
class DataStructure{
    vitrual value_type& getValAtIndex(int idx)=0;
};
class STDMap: public DataStructure{
   //Class that wraps a std::map object and implements the virtual method to return the value against a //particular index(key)
};
class HashMap: publlic DataStructure{
    //Class that wraps a boost::unordered_map object and implements the virtual method to return the value //against a particular index(key)
} 

我已经经历了:通用迭代器和转换迭代器。据我了解,转换迭代器仍然需要您在模板参数中给出底层容器迭代器。那么有没有办法使用转换迭代器围绕映射键定义自定义迭代器类型,同时使其适用于不同类型的映射容器?

如果您使用的是 Boost,则可以使用 any_range

typedef any_range<value_type, boost::forward_pass_traversal_tag,
  value_type &, std::ptrdiff_t> range;
typedef any_range<value_type, boost::forward_pass_traversal_tag,
  const value_type &, std::ptrdiff_t> const_range;
typedef range::iterator iterator;
typedef const_range::const_iterator const_iterator;
virtual iterator begin() = 0;
virtual iterator end() = 0;
virtual const_iterator begin() const = 0;
virtual const_iterator end() const = 0;

您的beginend虚拟只需要构造适当的迭代器:

iterator begin() { return iterator(object.begin()); }