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

发布于:2024-03-11 ⋅ 阅读:(61) ⋅ 点赞:(0)

正向迭代器

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

迭代器的变量与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*());
}
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到