在c++ 11中实现自定义迭代器
Implementing custom iterators in C++11
我在读一本书,我从模板章节开始。我已经读过关于迭代器的那一章。为了练习,我试图使用模板实现双链接类。下面是我的类的头文件。
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();
};
可以设置两个成员:
T* begin();
T* end();
…像非常基本的迭代器一样,但它们实际上不是迭代器。所以,我有一个问题:
如何实现用于所有算术运算的自定义迭代器类并拥有begin()
, cbegin()
, end()
和cend()
?
(我知道创建list类不会像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; }
};
应该在普通指针或迭代器上工作。您所要做的就是将其用作模板,并根据自定义容器的需要进行调整。如果T
是value_type
,那么成员函数通常返回
-
begin()
->iter<T*>
-
cbegin()
->iter<const T*>
-
rbegin()
->std::reverse_iterator<iter<T*> >
-
crbegin()
->std::reverse_iterator<iter<const T*> >
但是,由于您有自己的node_structure
,这并不完全正确,您需要详细说明。
相关文章:
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 无法使用自定义迭代器进行排序
- 指向临时对象的自定义迭代器(延迟加载)
- MSVC++ 17 std::copy 期望自定义迭代器的"operator -"
- 如何使用提升范围将自定义迭代器封装在函数中
- 如何将 std::num_put 与自定义迭代器一起使用?
- 自定义迭代器:如果 a 和 b 的行为不同,如何正确处理距离计算和相等比较
- std::sort 在我的自定义迭代器上不起作用
- 定义将函数调用到传递的元素的自定义迭代器
- C++17 pimpl 习语上下文中的自定义迭代器
- C++自定义迭代器和(*this)
- 如何使用自定义迭代器使用std :: lower_bound
- 自定义迭代器而不是解释问题
- 基于范围的自定义迭代器:constness问题
- 在自定义双链接列表中的自定义迭代器的取消运算符,找不到二进制操作员
- 创建自定义迭代器结构以与CSTDIO一起使用
- 矩阵类的C 自定义迭代器
- 自定义迭代器越界
- 矢量<struct>的自定义迭代器
- 我的自定义迭代器有什么问题