双向迭代器实现

由于某些原因,我需要实现一个双向迭代器,一段时间后,我得到了这个结果(add参数告诉迭代器应该移动到哪一侧(实现时避免代码重复reverse_iterator)):

#include <iterator>

namespace gph {
    template <typename T, int add> class BidirectionalIterator;

    template<typename T, int add>
    void swap(BidirectionalIterator<T, add>& it1, BidirectionalIterator<T, add>& it2) {
        it1.swap(it2);
    }

    template<typename T, int add>
    class BidirectionalIterator {
    private:
        T *currentPosition, *begin, *end;
    public:
        using difference_type = std::ptrdiff_t;
        using value_type = T;
        using pointer = T*;
        using reference = T&;
        using iterator_category = std::bidirectional_iterator_tag;

        inline BidirectionalIterator(T* currentPosition, T* begin, T* end):currentPosition(currentPosition), begin(begin), end(end) {}

        //copy constructor
        inline BidirectionalIterator(const BidirectionalIterator& iterator)
            :BidirectionalIterator(iterator.currentPosition, iterator.begin, iterator.end) {}

        //move constructor
        inline BidirectionalIterator(BidirectionalIterator&& iterator) noexcept
            :BidirectionalIterator(iterator.currentPosition, iterator.begin, iterator.end) {}

        //copy and move assignment statement
        inline BidirectionalIterator& operator=(BidirectionalIterator iterator) {
           gph::swap(*this, iterator);
        }

        inline void swap(BidirectionalIterator& iterator) {
            std::swap(currentPosition, iterator.currentPosition);
            std::swap(begin, iterator.begin);
            std::swap(end, iterator.end);
        }

        inline reference operator*() const {
            return *currentPosition; //dangerous if the iterator is in not-dereferenceable state
        }

        inline BidirectionalIterator& operator++() {
            if (currentPosition != end) currentPosition += add;

            return *this;
        }

        inline bool operator==(const BidirectionalIterator& iterator) const {
            return currentPosition == iterator.currentPosition;
        }

        inline bool operator!=(const BidirectionalIterator& iterator) const {
            return !(*this == iterator);
        }

        inline BidirectionalIterator operator++(int) {
            BidirectionalIterator past = *this;

            ++*this;

            return past;
        }

        inline BidirectionalIterator& operator--() {
            if (currentPosition != begin) currentPosition -= add;

            return *this;
        }

        inline BidirectionalIterator operator--(int) {
            BidirectionalIterator past = *this;

            --*this;

            return past;
        }
    };
}

我试着满足MoveAssignableMoveConstructibleCopyAssignableCopyConstructibleSwappableEqualityComparableLegacyIteratorLegacyInputIteratorLegacyForwardIteratorLegacyBidirectionalIterator命名的要求。

他们的某些要求以运算符重载来表示,但是其中的一些我不知道如何实现(也许,它们是由其他人自动实现的?),例如:i->m*i++(从此处开始)。第一个问题:我应该如何实施它们?

第二个问题:我的迭代器实现良好吗?它有什么缺点,我在哪里犯了错误?

PS问题是非建设性的,但是我确实需要帮助。对不起我的英语不好。

丘里尔

我发现很难找到一个明确的答案,因此,仅是一些想法可能是不完整的,尚需讨论。

  • i->m 可以通过 inline pointer operator->() { return this->currentPosition; }
  • *i++ 应该已经包含在您的实现中
  • 我看不出有任何理由交换中的所有指针operator=出于三个原因:

    1. 您正在将值与局部变量交换
    2. move构造函数不交换任何值(BidirectionalIterator newIt=oldIt;and之间的行为会不一致BidirectionalIterator newIt(oldIt);,但这实际上并不是因为上一点)
    3. 这些指针不是唯一的资源,因此在多个实例之间复制和共享它们没有问题。
  • operator=缺少一个return
  • 您有using difference_type = std::ptrdiff_t;但不执行operator-将返回的内容difference_type,为什么不执行呢?
  • 反向迭代器可以通过std :: reverse_iterator轻松实现,该方法将只包装您的迭代器并反转++和-等。
  • 您可能想找到一种简单的方法来实现迭代器的const版本(始终返回aconst T&的版本const T*)。我看到了三个版本:
    • 复制所有代码
    • 使用const cast
    • 使用其他模板参数bool TIsConstusing pointer = std::conditional_t<TIsConst, const T*, T*>;
    • const T另一方面,使用带有参数的模板化迭代器可能看起来很简单,但不能满足要求,请参阅此问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章