c++之迭代器与反向迭代器

正向迭代器

链表的迭代器为例
具体的代码以及可以看上一篇链表的文章:链表

迭代器的变量与typedef与模版

这例typedef是因为不想写太长
T代表类型
Ref 可以设置const与非const的迭代器
Ptr是传过来的其他类

template<class T,class Ref,class Ptr>
struct __list__iterator
{
typedef listNode<T> Node;
typedef __list__iterator<T,Ref,Ptr> self;
Node* _node;
};

operator++()

因为迭代器是需要支持++遍历的所以要重载operator++()
不同的编译器都可能不太一样

self& operator++()
{
	_node = _node->_next;
	return *this;
}
//后置
self& operator++(int)
{
	self tmp(*this);
	_node = _node->_next;
	return tmp;
}

operator–()

同时也要支持倒着遍历

self& operator--()
{
	_node= _node->_prev;
	return *this;

}
self& operator--(int)
{
	self tmp(*this);
	_node = _node->_prev;
	return tmp;
}

operator*()

解引用找其对应的内容

Ref operator*()
{
	return _node->date;
}

operator->()

这个是为了如果传过来的是类,可以访问其类里面的内容

Ptr operator->()
{
	return &_node->date;
}

反向迭代器

反向迭代器因为和迭代器的代码太统一了,所以前辈们把反向迭代器进行了封装
让其可以用于所有的反向迭代器,这样子所有的容器的可以用这个统一的反向迭代器

模版与typedef与变量

Iterator是传过来的类的正向迭代器
Ref是判断const还是非const
Prt是传过来的其他类
为什么是传迭代器过来呢
因为每个迭代器实现都不一样他要用不同的迭代器
进行统一操作只能回调迭代器里面的东西

template<class Iterator,class Ref,class Prt>
struct Reverselterator
{
	typedef Reverselterator<Iterator, Ref,Prt> Self;
	Iterator cur;
};

operator++()

因为是反向迭代器所以++就是往前走

Self& operator++()
{
	--cur;
	return *this;
}

operator–()

反向迭代器–是往后走

Self& operator--()
{
	++cur;
	return *this;
}

operator*()

因为我设置的end在链表中是哨兵位所以要往返回其上一位的节点
找到上一个位置返回

Ref operator*()
{
	//找到上一个位置的值返回
	Iterator tmp = cur;
	--tmp;
	return *tmp;
}

operator->()

operator()是*tmp引用返回就是返回他的指针的别名然后再->其内容*
因为->->不好看所以前辈们做的特殊处理

Prt operator->()
{
	return &(operator*());
}
  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dabai__a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值