map的实现 - 如何在迭代器中区分map的两端

时间:2016-01-15 22:47:36

标签: c++ dictionary iterator

迭代器实施:

 class iterator {
        private:
            Node<Pair>* _ptr = nullptr;
        public:

            iterator(Node<Pair>* ptr = nullptr) : _ptr(ptr) { }

            iterator(const iterator& itr) = default;

            ~iterator() = default;

            iterator& operator=(const iterator&) = default;

            iterator operator++(int) {
                Node<Pair> *cur = this->_ptr;
                if (this->_ptr) {
                    this->_ptr = _ptr->Next();
                }
                return cur;
            }

            iterator& operator++() {
                if (this->_ptr) {
                    this->_ptr = _ptr->Next();
                }
                return *this;
            }

            Pair& operator*() {
                if (!this->_ptr) {
                    throw MapElementNotFoundException();
                }
                return this->_ptr->Data();
            }

            bool operator==(const iterator& itr) const {
                if ((this->_ptr == nullptr && itr._ptr == nullptr) ||
                    (this->_ptr == itr._ptr)) {
                    return true;
                }
                return false;
            }

            friend bool operator!=(const iterator& itr1, const iterator& itr2) {///// non member
                return !(itr1 == itr2);
            }
        };

专家级地图类:

    Node<Pair> *_head;
    ValueType _default; /////////////////////////////////////////////////
    int _size;

方法的开始和结束:

iterator begin() const{
            return iterator(this->_head);
        }

        iterator end() const{
            return iterator(nullptr); //////////////////////////////////////////////
        }

如何实现迭代器和结束方法以便这样做:

ASSERT_EQUALS(false, map9.end() == map7.end());

我的目标是以这种方式实现迭代器,我可以正确地实现operator ==和!= for iterators,因为如果指向同一个map中的同一个对象,则两个迭代器是相同的,而在其他迭代器中是不同的方式。

编辑:(解决方案)

private:
            Node<Pair>* _ptr/* = nullptr */;
            MtmMap<ValueType, KeyType, CompareFunction>* _map_ptr;
        public:

            iterator(Node<Pair>* ptr/* = nullptr*/,const MtmMap<ValueType, KeyType, CompareFunction> * mtm_ptr)
                : _ptr(ptr), _map_ptr(mtm_ptr){ }

为什么编译器说这里存在const-correctnes问题。它说它不能从const MtmMap * mtm_ptr转换为MtmMap * mtm_ptr。 但它只是ptr的副本。

0 个答案:

没有答案