代码之家  ›  专栏  ›  技术社区  ›  user997112

为自定义std::map迭代器实现erase()

  •  0
  • user997112  · 技术社区  · 6 年前

    std::map ,以及一个迭代器类,以允许控制对 map 的密钥:

    #include <map>
    
    class Container
    {
    public:
        class iterator
        {
            using map = std::map < int, int >;
            map::const_iterator _iter;
    
        public:
            iterator() {}
            iterator(map::iterator iter) :_iter(iter) {}
            iterator(map::const_iterator iter) :_iter(iter) {}
            iterator(const iterator& b) :_iter(b._iter) {}
    
            iterator& operator=(const iterator& b)
            {
                _iter = b._iter;
                return *this;
            }
    
            iterator& operator++()
            {
                ++_iter;
                return *this;
            }
    
            iterator operator++(int)
            {
                return iterator(_iter++);
            }
    
            const map::key_type first()
            {
                return std::abs(_iter->first);
            }
    
            const int second()
            {
                return _iter->second;
            }
    
            bool operator==(const iterator& b)
            {
                return _iter == b._iter;
            }
    
            bool operator!=(const iterator& b)
            {
                return _iter != b._iter;
            }
        };
    
        void insert(int key, int value)
        {
            _map[-key] = value;  // Key is modified from user, hence need for wrapper
        }
    
        iterator begin()
        {
            return iterator(_map.begin());
        }
    
        iterator end()
        {
            return iterator(_map.end());
        }
    
        iterator find(int key)
        {
            return iterator(_map.find(key));
        }
    
        iterator erase(iterator iter)
        {
            return iterator(_map.erase(iter));
        }
    
    private:
    
        std::map<int, int> _map;
    };
    

    我需要做的手术是:

    • 发现
    • 删除
    • 获取价值

    我希望用法如下:

    int main()
    {
        Container o;
        o.insert(-1, 100);
        o.insert(-2, 200);
        o.insert(-3, 300);
        o.insert(-4, 300);
    
        for (Container::iterator i = o.begin(); i != o.end();)
        {
            if (i.first() == -2)
            {
                std::cout << i.first() << " " << i.second() << std::endl;
                ++i;
            }
            else
            {
                i = o.erase(i);
            }
        }
    }
    

    但是,我正在努力实现容器的 erase() 方法,因为输入是我的自定义 iterator 输入,而不是地图的 key_type .

    1 回复  |  直到 6 年前
        1
  •  3
  •   rsy56640    6 年前

    声明类 Container 作为朋友类 Iterator ,并访问 _iter 在里面 erase 功能。

    class iterator
    {
        friend class Container;
        //...
    }
    
    iterator Container::erase(iterator iter)
    {
        return iterator(_map.erase(iter._iter));
    }