![](/img/trans.png)
[英]C++ primer 5 edition: shared_ptr initialized from uniqe_ptr?
[英]Implement iterator for std::uniqe_ptr Linked list
到目前为止,这是我的代码,它显然不起作用。 我希望这个迭代器能够在基于范围和增量的 for 循环上工作。 我该怎么做?
template<typename T>
class MyList {
public:
class Node {
public:
Node(const T& data): data(data) {
this->next = NULL;
}
std::unique_ptr<Node> next;
T data;
};
MyList() {
this->_size = 0;
}
int size() const;
void push_front(const T& data);
T pop_front();
T front() const;
void remove(T data);
typedef T* iterator;
typedef const Node* const_iterator;
iterator begin() {
return (&_head.get()->data);
}
iterator end() {
return (NULL);
}
private:
int _size;
std::unique_ptr<MyList<T>::Node> _head;
};
T*
不适合作为链表迭代器,因为它在递增时无法到达列表中的下一个节点。 也因为&_head.get()->data
在列表为空时无效。
而且Node*
也不适用于iterator
或const_iterator
,因为它不能有一个有效的operator++
来迭代列表,也不能有一个operator*
来访问data
。 请参阅ForwardIterator的要求。
您最好定义一个单独的类型来充当(const_)iterator
,并让它在内部保存一个Node*
以进行迭代和取消引用,例如:
template<typename T>
class MyList {
public:
class Node {
public:
Node(const T& data): data(data) {}
std::unique_ptr<Node> next;
T data;
};
template<typename D>
class my_iterator
{
public:
my_iterator(Node* node) : _current(node) {}
bool operator==(const my_iterator &rhs) const { return _current == rhs._current; }
D& operator*() { return _current->data; }
D* operator->() { return &(_current->data); }
my_iterator& operator++() { _current = _current->next.get(); return *this; }
my_iterator operator++(int) { my_iterator tmp(_current); ++(*this); return tmp; }
private:
Node* _current;
};
using iterator = my_iterator<T>;
using const_iterator = my_iterator<const T>;
...
iterator begin() {
return iterator(_head.get());
}
const_iterator cbegin() const {
return const_iterator(_head.get());
}
iterator end() {
return iterator(nullptr);
}
const_iterator cend() const {
return const_iterator(nullptr);
}
...
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.