Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 映射的实现-如何在迭代器中区分映射的两端_C++_Dictionary_Iterator - Fatal编程技术网

C++ 映射的实现-如何在迭代器中区分映射的两端

C++ 映射的实现-如何在迭代器中区分映射的两端,c++,dictionary,iterator,C++,Dictionary,Iterator,迭代器实现: class iterator { private: Node<Pair>* _ptr = nullptr; public: iterator(Node<Pair>* ptr = nullptr) : _ptr(ptr) { } iterator(const iterator& itr) = default; ~ite

迭代器实现:

 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());
我如何实现迭代器和end方法使其工作:

 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());
我的目标是以这种方式实现迭代器,在这种方式中,我可以正确地实现运算符==和!=对于迭代器,因为如果两个迭代器指向同一映射中的同一对象,则两个迭代器是相同的,而在其他方面不同

编辑:(解决方案)

private:
节点*ptr/*=nullptr*/;
MtmMap*\u地图\u ptr;
公众:
迭代器(Node*ptr/*=nullptr*/,const MtmMap*mtm_ptr)
:_ptr(ptr),_map_ptr(mtm_ptr){}
为什么编译器说这里有一个const-correctnes问题。它说它不能从常量MtmMap*mtm_ptr转换到MtmMap*mtm_ptr。
但它只是ptr的副本。

通常,甚至比较不同容器中的迭代器都是不合法的。这是所有
std::
容器和指向原始数组的指针的情况。但是,例如,您可以在迭代器中存储指向容器本身的指针。使它更重一点,但允许您检查来自相同或不同容器的两个迭代器。或者让过去的结束迭代器指向一个sentinel节点,可能嵌入到容器中。是否可以像在迭代器中一样处理它我将保存节点**?指向指针对的指针,然后仅当它们相等时,这是同一张地图。这样,我就不必存储指向容器的指针了,对吗?我看到了几种方法:*扩展迭代器以保存指向容器的指针。这将是微不足道的,但会使迭代器更大。*在容器的末尾添加一个标记对象(即,使迭代器::\u ptr永远不为null)。那么两个指针值就永远不会相同。这可能会使您的容器更大/更复杂。*接受你生活在一个不完美的世界,不要处理这种情况(与STL相同)。