我正在读一本书,我开始了模板章节。我已经阅读了关于迭代器的章节。为了练习,我正在尝试使用模板实现一个双向链接的类。下面是我的类的头文件。
template<typename T>
class list
{
private:
T* first_node;
T* last_node;
struct node_structure
{
T* previous;
T* next;
T content;
};
public:
list();
void push_back( T& item );
void push_front( T& item );
void remove( size_t index );
size_t size() const;
T& get_node( size_t index );
void clear();
~list();
};
Run Code Online (Sandbox Code Playgroud)
我可以设置两个成员:
T* begin();
T* end();
Run Code Online (Sandbox Code Playgroud)
...表现得像非常基本的迭代器,但它们实际上不是迭代器。所以,我有一个问题:
如何实现自定义的迭代器类与所有的算术运算和使用有begin(),cbegin(),end(),和cend()?
(我知道创建列表类的效率不如std::list,但我这样做只是为了练习。)
如果您查看 的实现<iterator>,您会发现类似 的内容__normal_iterator,如下所示:
template<typename I>
class iter
{
protected:
I i;
using tr = iterator_traits<I>;
public:
using iterator_type = I;
using iterator_category = typename tr::iterator_category;
using value_type = typename tr::value_type;
using difference_type = typename tr::difference_type;
using reference = typename tr::reference;
using pointer = typename tr::pointer;
iter() : i(I()) { }
explicit iter(const I& i) : i(i) { }
// Forward iterator requirements
reference operator*() const { return *i; }
pointer operator->() const { return i; }
iter& operator++() { ++i; return *this; }
iter operator++(int) { return iter(i++); }
// Bidirectional iterator requirements
iter& operator--() { --i; return *this; }
iter operator--(int) { return iter(i--); }
// Random access iterator requirements
reference operator[](const difference_type& n) const { return i[n]; }
iter& operator+=(const difference_type& n) { i += n; return *this; }
iter operator+(const difference_type& n) const { return iter(i + n); }
iter& operator-=(const difference_type& n) { i -= n; return *this; }
iter operator-(const difference_type& n) const { return iter(i - n); }
const I& base() const { return i; }
};
Run Code Online (Sandbox Code Playgroud)
这应该适用于普通指针或迭代器。您所要做的就是将其用作模板并根据您的自定义容器的需要进行调整。如果T是 your value_type,则成员函数通常返回
begin() -> iter<T*>cbegin() -> iter<const T*>rbegin() -> std::reverse_iterator<iter<T*> >crbegin() -> std::reverse_iterator<iter<const T*> >然而,因为你有你的node_structure,这并不完全正确,你需要详细说明一点。
| 归档时间: |
|
| 查看次数: |
6560 次 |
| 最近记录: |