C++迭代器

文章目录

迭代器的分类

迭代器有正向迭代器和反向迭代器两种,先来回顾一下正向迭代器,正向迭代器中begin()指向容器的第一个元素,end()指向容器的最后一个元素的下一个位置,而反向迭代器rbegin()指向最后一个元素,rend()指向第一个元素的前一个位置,接下来我们在list中通过正向迭代器改造出反向迭代器,首先我们要指明的是反向迭代器是通过正向迭代器构造而来。

正向迭代器

cpp 复制代码
typedef list_node<T> Node;
public:
	//typedef __list_iterator<T> iterator;
	typedef __list_iterator<T, T&, T*> iterator;
	typedef __list_iterator<T, const T&, const T*> const_iterator;

		//下面这样设计const迭代器是不行的,因为const迭代器期望指向的内容不能被修改,迭代器本身能被修改
		//typedef const list_node<T> const_iterator;
iterator begin()
{
	//return _head->_next;//两种都可以,这种属于单参数支持隐式类型转换
	return iterator(_head->_next);
}

iterator end()
{
	//return _head->_prev;
	return iterator(_head);
}

const_iterator begin() const
{
	//return _head->_next;//两种都可以,这种属于单参数支持隐式类型转换
	return const_iterator(_head->_next);
}

const_iterator end() const
{
	//return _head->_prev;
	return const_iterator(_head);
}

反向迭代器

cpp 复制代码
		//通过适配器,适配出反向迭代器
typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;

reverse_iterator rbegin()
{
	return reverse_iterator(end());
}

reverse_iterator rend()
{
	return reverse_iterator(begin());
}

const_reverse_iterator rbegin() const
{
	return const_reverse_iterator(end());
}

const_reverse_iterator rend() const
{
	return const_reverse_iterator(begin());
}

Reverse_iterator类

cpp 复制代码
template<class Iterator, class Ref, class Ptr>
struct ReverseIterator
{
typedef ReverseIterator<Iterator, Ref, Ptr> Self;
Iterator _it;//成员是正向迭代器--------正向迭代器构造出反向迭代器

ReverseIterator(Iterator it)
	:_it(it)
{

}

Ref operator*()
{
	Iterator tmp = _it;//赋给临时变量,因为不能去改变原it
	return *(--tmp);
}

Ptr operator->()
{
	return &(operator*());
}

Self& operator++()//调用正向迭代器的减减
{
	--_it;
	return *this;
}

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

bool operator!=(const Self& s) const
{
	return _it != s._it;
}

rbegin()在底层实际上是调用的end()

rend()在底层实际上是调用的begin()

迭代器本质上是指针,那么又是怎么做到返回的rbegin这个迭代器指针解引用时,值为容器的最后一个值而不是最后一个值的下一个值呢?这是因为我们在底层对反向迭代器指针解引用时也做了处理

就是在当前为位置--之后再被解引用,同理rend()也是

因此在我们使用时呈现出的结果是这样

其实在底层实现时是这样

使得底层逻辑变得更加对称

此外重载的运算符++和--在底层对应的是正向迭代器的--和++

相关推荐
t***5447 小时前
如何在现代C++中更有效地应用这些模式
java·开发语言·c++
itman3017 小时前
C语言、C++与C#深度研究:从底层到现代开发演进全解析
c语言·c++·c·内存管理·编译模型
Hical_W9 小时前
为 C++ Web 框架设计三层 PMR 内存池:从原理到实战
c++·github
BestOrNothing_20159 小时前
C++零基础到工程实战(3.6):逻辑实战示例—日志模块
c++·命令行参数·main函数·switch case·逻辑判断·if else·enum class
t***5449 小时前
有哪些常见的架构设计模式在现代C++中应用
开发语言·c++
zopple10 小时前
汇编、C、C++和Java核心技术对比
c语言·汇编·c++
汉克老师10 小时前
GESP2024年3月认证C++三级( 第三部分编程题(1、字母求和)
c++·string·gesp三级·gesp3级·大小写判断
沐雪轻挽萤11 小时前
10. C++17新特性-保证的拷贝消除 (Guaranteed Copy Elision / RVO)
开发语言·c++
leaves falling11 小时前
C/C++ 的内存管理,函数栈帧详讲
java·c语言·c++
wuyoula11 小时前
AI导航智能决策系统源码 附教程
c++·tcp/ip·源码