基于指针的基本随机访问迭代器的代码?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于指针的基本随机访问迭代器的代码?相关的知识,希望对你有一定的参考价值。

我从来没有实现类似STL的迭代器,我试图理解如何基于指针实现一个非常基本的东西。一旦我有了这门课程,我就可以修改它来做更复杂的事情。因此,这是第一步,我需要它坚如磐石才能理解如何编写自己的迭代器(没有boost)。

我写了下面的代码,我知道它有错误。你能帮助我正确设计一个受其启发的Random Access Iterator类:

template<Type> class Container<Type>::Iterator : public std::iterator<random_access_iterator_tag, Type>
{
    // Lifecycle:
    public:
        Iterator() : _ptr(nullptr) {;}
        Iterator(Type* rhs) : _ptr(rhs) {;}
        Iterator(const Iterator &rhs) : _ptr(rhs._ptr) {;}

    // Operators : misc
    public:
        inline Iterator& operator=(Type* rhs) {_ptr = rhs; return *this;}
        inline Iterator& operator=(const Iterator &rhs) {_ptr = rhs._ptr; return *this;}
        inline Iterator& operator+=(const int& rhs) {_ptr += rhs; return *this;}
        inline Iterator& operator-=(const int& rhs) {_ptr -= rhs; return *this;}
        inline Type& operator*() {return *_ptr;}
        inline Type* operator->() {return _ptr;}
        inline Type& operator[](const int& rhs) {return _ptr[rhs];}

    // Operators : arithmetic
    public:
        inline Iterator& operator++() {++_ptr; return *this;}
        inline Iterator& operator--() {--_ptr; return *this;}
        inline Iterator& operator++(int) {Iterator tmp(*this); ++_ptr; return tmp;}
        inline Iterator& operator--(int) {Iterator tmp(*this); --_ptr; return tmp;}
        inline Iterator operator+(const Iterator& rhs) {return Iterator(_ptr+rhs.ptr);}
        inline Iterator operator-(const Iterator& rhs) {return Iterator(_ptr-rhs.ptr);}
        inline Iterator operator+(const int& rhs) {return Iterator(_ptr+rhs);}
        inline Iterator operator-(const int& rhs) {return Iterator(_ptr-rhs);}
        friend inline Iterator operator+(const int& lhs, const Iterator& rhs) {return Iterator(lhs+_ptr);}
        friend inline Iterator operator-(const int& lhs, const Iterator& rhs) {return Iterator(lhs-_ptr);}

    // Operators : comparison
    public:
        inline bool operator==(const Iterator& rhs) {return _ptr == rhs._ptr;}
        inline bool operator!=(const Iterator& rhs) {return _ptr != rhs._ptr;}
        inline bool operator>(const Iterator& rhs) {return _ptr > rhs._ptr;}
        inline bool operator<(const Iterator& rhs) {return _ptr < rhs._ptr;}
        inline bool operator>=(const Iterator& rhs) {return _ptr >= rhs._ptr;}
        inline bool operator<=(const Iterator& rhs) {return _ptr <= rhs._ptr;}

    // Data members
    protected:
        Type* _ptr;
};

非常感谢你。

答案

一般来说,你的方法是对的。 postfix increment/decrement operator should return by value,不是参考。我也怀疑:

Iterator(Type* rhs) : _ptr(rhs) {;}

这告诉大家这个迭代器类是围绕指针实现的。我会尝试使这个方法只能由容器调用。分配给指针也是如此。添加两个迭代器对我来说没有意义(我会留下“iterator + int”)。提取两个指向同一容器的迭代器可能会有所帮助。

另一答案

您的代码存在以下问题:

  • 你不遵循三/五规则。在您的情况下,最好的选择是不声明任何自定义析构函数,复制/移动构造函数或复制/移动赋值运算符。让我们遵循所谓的零度规则。
  • Iterator(Type* rhs)可以是私人的,Container可以被标记为Iterator的朋友,但这不是绝对必要的。
  • operator=(Type* rhs)是一个坏主意。这不是什么类型的安全。
  • 后期(de)crementation应返回Iterator,而不是Iterator &
  • 添加两个迭代器没有意义。
  • 减去两个迭代器应该返回差异,而不是新的迭代器。
  • 你应该使用std::iterator<std::random_access_iterator_tag, Type>::difference_type而不是const int &
  • 如果方法不修改对象,则应将其标记为const

有用的资源:RandomAccessIterator @ cppreference.com

以下是您的代码的固定版本:

template<typename Type>
class Container<Type>::Iterator : public std::iterator<std::random_access_iterator_tag, Type>
{
public:
    using difference_type = typename std::iterator<std::random_access_iterator_tag, Type>::difference_type;

    Iterator() : _ptr(nullptr) {}
    Iterator(Type* rhs) : _ptr(rhs) {}
    Iterator(const Iterator &rhs) : _ptr(rhs._ptr) {}
    /* inline Iterator& operator=(Type* rhs) {_ptr = rhs; return *this;} */
    /* inline Iterator& operator=(const Iterator &rhs) {_ptr = rhs._ptr; return *this;} */
    inline Iterator& operator+=(difference_type rhs) {_ptr += rhs; return *this;}
    inline Iterator& operator-=(difference_type rhs) {_ptr -= rhs; return *this;}
    inline Type& operator*() const {return *_ptr;}
    inline Type* operator->() const {return _ptr;}
    inline Type& operator[](difference_type rhs) const {return _ptr[rhs];}

    inline Iterator& operator++() {++_ptr; return *this;}
    inline Iterator& operator--() {--_ptr; return *this;}
    inline Iterator operator++(int) const {Iterator tmp(*this); ++_ptr; return tmp;}
    inline Iterator operator--(int) const {Iterator tmp(*this); --_ptr; return tmp;}
    /* inline Iterator operator+(const Iterator& rhs) {return Iterator(_ptr+rhs.ptr);} */
    inline difference_type operator-(const Iterator& rhs) const {return Iterator(_ptr-rhs.ptr);}
    inline Iterator operator+(difference_type rhs) const {return Iterator(_ptr+rhs);}
    inline Iterator operator-(difference_type rhs) const {return Iterator(_ptr-rhs);}
    friend inline Iterator operator+(difference_type lhs, const Iterator& rhs) {return Iterator(lhs+rhs._ptr);}
    friend inline Iterator operator-(difference_type lhs, const Iterator& rhs) {return Iterator(lhs-rhs._ptr);}

    inline bool operator==(const Iterator& rhs) const {return _ptr == rhs._ptr;}
    inline bool operator!=(const Iterator& rhs) const {return _ptr != rhs._ptr;}
    inline bool operator>(const Iterator& rhs) const {return _ptr > rhs._ptr;}
    inline bool operator<(const Iterator& rhs) const {return _ptr < rhs._ptr;}
    inline bool operator>=(const Iterator& rhs) const {return _ptr >= rhs._ptr;}
    inline bool operator<=(const Iterator& rhs) const {return _ptr <= rhs._ptr;}
private:
    Type* _ptr;
};
另一答案

看看Boost如何做到这一点,boost/container/vector.hpp中的迭代器 - vector_const_iteratorvector_iterator相当容易理解基于指针的迭代器。

以上是关于基于指针的基本随机访问迭代器的代码?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 共享指针的行为不像迭代器的标准指针?

迭代器的解释

是迭代器的指针类型转换吗?

迭代器

C++ 的STL中,迭代器那个指针为何++能指向下一个元素?

迭代器的注意事项