首页 > 解决方案 > 存储迭代器的 iterator_category 应该是什么?

问题描述

语境:

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

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

前向迭代器 [forward.iterators]

...
6如果ab都是可解引用的,那么a == b当且仅当*a*b被绑定到同一个对象。

不尊重它的原因是operator *必须返回对子容器的引用。所以我的实现是一个存储迭代器,它包含一个随迭代器移动的子容器成员,并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尝试使用它的标记

参考:

标签: c++iterator

解决方案


推荐阅读