对于存储迭代器,iterator_category应该是什么?

时间:2018-06-18 12:37:22

标签: c++ iterator

上下文

我正在尝试构建一个容器,它将作为运行时定义维度的多维数组的包装器 - 实际上底层数组当然是总大小的一维数组。主要部分是operator []返回子数组的包装器。

由于容器需要迭代器,我目前正在该容器上实现迭代器,Container::iteratorContainer::const_iterator。我努力模仿标准容器迭代器,我的实现几乎满足随机访问迭代器的所有要求,除了:

  

转发迭代器[forward.iterators]

     

...
6 如果ab都可以取消引用,则a == b当且仅当*a*b绑定到同一个对象。

不尊重它的原因是operator *必须返回对子容器的引用。所以我的实现是一个 stashing iterator ,它包含一个随迭代器一起移动的子容器成员,operator *返回对这个成员对象的引用

过度简化的实施:

template <class T>
class SubArray {
    T *arr;
    size_t *sizes;
    size rowsize;
public:
    ...
    Iterator<T> begin() {
        return Iterator<T>(operator[](0));
    }
    ...
};

class Iterator<T> {
   SubArray elt;
public:
    Iterator(const SubArray<T>& pos): elt(pos) {}
    ...
    SubArray<T>& operator *() {
        return elt;
    ...
};

根据cppreference(以及不同实现的来源)std::filesystem::path::iterator也是一个存储迭代器。

问题

迭代器的iterator_category成员应该帮助其他类从输入迭代器到随机访问来识别迭代器的类型。什么应该是我的存储迭代器的iterator_category,它几​​乎满足了随机访问迭代器的所有要求,但是对于一个前向迭代器的点失败了?注意:这足以使std::reverse_iterator无法使用。

注:

我可以确认std::filesystem::path::iterator包含Clang实现:

typedef bidirectional_iterator_tag iterator_category;

但也是阻止std::reverve_iterator尝试使用它的标记

参考文献:

  • Code Review
  • 上我的容器类的完整源代码
  • 关于SO
  • 上的存储容器上std::reverse_iterator的问题
  • std::reverse_iteratorcppreference上(请参阅示例代码上方的说明)

0 个答案:

没有答案