代码之家  ›  专栏  ›  技术社区  ›  Serge Ballesta

隐藏迭代器的迭代器类别应该是什么?

  •  7
  • Serge Ballesta  · 技术社区  · 7 年前

    上下文:

    operator [] 返回子数组的包装。

    由于容器需要迭代器,我目前正在该容器上实现迭代器,两者 Container::iterator Container::const_iterator

    前向迭代器

    ...
    如果 a b a == b 如果且仅当 *a *b

    不尊重它的原因是 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 迭代器的成员应该帮助其他类识别迭代器的类型,从输入迭代器到随机访问。应该是什么 在我的隐藏迭代器中,它几乎满足了随机访问迭代器的所有需求,但是对于一个转发迭代器点却失败了?注:这足以使 std::reverse_iterator 不能用在上面。

    备注:

    std::filesystem::path::迭代器 包含用于Clang实现的:

    typedef bidirectional_iterator_tag iterator_category;
    

    同时也是预防 std::reverve_iterator

    参考文献:

    0 回复  |  直到 7 年前