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

时间:2018-08-19 02:24:54

标签: c++ dictionary std stdmap c++-standard-library

我编写了一个包装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 个答案:

答案 0 :(得分:3)

将类Container声明为Iterator的朋友类,并在_iter函数中访问erase

class iterator
{
    friend class Container;
    //...
}

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