迭代器实施:
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的副本。