我为项目创建了一个单独的链接列表,现在需要创建一个自定义的Iterator类。我的链表中有一个嵌套类来定义我的迭代器。我已经编写了大部分类,但对于如何实现某些功能感到困惑。我的问题如下:
- 请看我的end()函数。我将它设置为Iterator类的默认构造函数,所以 我想,迭代器中的currentNode变量默认为NULL。这是否正确实施?
- 如何重载 - > Iterator类中的运算符?
class SSLL_Iter : public std::iterator<std::forward_iterator_tag, T>
{
public:
typedef T value_type;
typedef std::ptrdiff_t difference_type;
typedef T& reference;
typedef T* pointer;
typedef std::forward_iterator_tag iterator_category;
typedef SSLL_Iter self_type;
typedef SSLL_Iter& self_reference;
private:
Node* currentNode;
public:
explicit SSLL_Iter( Node* start = NULL) : currentNode( start ) {} //****************complete
SSLL_Iter( const SSLL_Iter& src ) : currentNode( src.currentNode ) {} //****************complete
reference operator*() const { //****************complete
T& temp = (currentNode->data);
return temp;
}
pointer operator->() const {} //*******??????????????????
self_reference operator=( const SSLL_Iter& src ) { //****************complete
this->here = src.here;
return *this;
}
self_reference operator++() { // preincrement //****************complete
currentNode = currentNode->next;
return *this;
}
self_type operator++(int) { // postincrement //****************complete
self_type temp = (*this);
++(*this);
return temp;
}
bool operator==(const SSLL_Iter& rhs) const { //****************complete
return (this->currentNode == rhs.currentNode);
}
bool operator!=(const SSLL_Iter& rhs) const { //****************complete
return (this->currentNode != rhs.currentNode);
}
}; // end SSLL_Iter
typedef std::size_t size_t;
typedef T value_type;
typedef SSLL_Iter iterator;
//typedef Const_SSL_Iter const_iterator;
SSLL() {}
SSLL(const SSLL& src ) {
for(int i = 0; i < src.size(); ++i) { // populate this SSLL with copies of the other SSLL's contents
this->push_back(src.item_at(i));
}
}
~SSLL() {
if(!is_empty()) {
clear();
}
}
iterator begin() { return SSLL_Iter( head ); }
iterator end() { return SSLL_Iter(); }
答案 0 :(得分:0)
return &*(*this);
是一个体面的operator->
。
您的SSLL
类可能没有效率at
,因此请勿在复制构造函数中使用它。相反,请创建SSLL
template<class Iterator> void append(Iterator s, Iterator f)
,并根据其实施SSLL(const SSLL& src)
。
如果您支持C ++ 11,请考虑使用next
替换Node
的{{1}}节点。对std::unique_ptr<Node>
根目录中的指针Node
执行相同操作。现在几乎可以自动处理内存管理。在更改后,您的迭代器中可能需要SSLL
。这也消除了析构函数的主体,使你的move-constructor .get()
正确(除非你在计算节点),等等。