gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:44:14 26 4
gpt4 key购买 nike

我已经编写了一个类来环绕 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;
};

我需要的操作是:

  • 迭代
  • 发现
  • 删除
  • 获取 key
  • 获取值(value)

我希望用法是这样的:

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 类型,而不是 map 的 key_type .

最佳答案

声明类 Container作为Iterator的 friend 类, 并访问 _itererase功能。

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

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

关于c++ - 为自定义 std::map 迭代器实现 erase(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51913943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com