C++ 迭代器萃取

本文详细介绍了C++中迭代器的概念,包括其五种基本类型:只读迭代器、可写迭代器、正向迭代器、双向迭代器和随机访问迭代器。此外,还探讨了迭代器类型定义、迭代器萃取以及如何通过迭代器萃取获取迭代器的属性。示例代码展示了如何自定义迭代器并实现`advance`函数,以根据迭代器类型进行不同的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器型别

  • value type 值类型,是指迭代器所知物件的型别
  • difference type 相差型别,表示两个迭代器之间的距离
  • reference type 引用类型,从迭代器所指之物的内容是否允许改变
  • pointer type 指针类型,迭代器所指之物的地址
  • iterator_category 迭代器的相应型别

迭代器类型

  • Input Iterator 只读迭代器
  • Output Iterator 可写迭代器
  • Forward Iterator 正向迭代器
  • Bidirectional Iterator 双向迭代器
  • Random Access Iterator 随机性迭代器

在这里插入图片描述

迭代器萃取

my_iterator.h

namespace zyq
{
	typedef int ptrdiff_t;

	struct input_itertaor_tag{};
	struct output_iterator_tag{};
	struct forward_iterator_tag :public input_itertaor_tag {};
	struct bidirectional_iterator_tag:public forward_iterator_tag{};
	struct random_access_iterator_tag:public bidirectional_iterator_tag{};

	template<class _C,class _Ty,class _D = ptrdiff_t,class _Pointer = _Ty*,class _Reference = _Ty&>
	struct iterator //全局迭代器类型
	{
		typedef _C            iterator_category; //迭代器类型
		typedef _Ty           value_type;        //迭代器所指类型
		typedef _D            difference_type;   //差值
		typedef _Pointer      pointer;           //指针
		typedef _Reference    reference;         //引用
	};

	template<class _Iterator>
	struct iterator_traits //迭代器萃取
	{
		iterator_traits() {}
		typedef typename _Iterator::iterator_category  iterator_category;
		typedef typename _Iterator::value_type         value_type;
		typedef typename _Iterator::difference_type    difference_type;
		typedef typename _Iterator::pointer			   pointer;
		typedef typename _Iterator::reference          reference;
	};

	//正向迭代器
	template<class _Ty, class _D>
	struct _Forit :public iterator<forward_iterator_tag, _Ty, _D> {};
	//双向迭代器
	template<class _Ty,class _D>
	struct _Bidit :public iterator<bidirectional_iterator_tag, _Ty, _D> {};
	//随机迭代器
	template<class _Ty, class _D>
	struct _Ranit :public iterator<random_access_iterator_tag, _Ty, _D> {};
	 


	template<class _II,class _D>
	inline void __advance(_II& i, _D n, input_itertaor_tag)
	{
		//while (n--) ++i;
	}
	template<class _BI, class _D>
	inline void __advance(_BI& i, _D n, bidirectional_iterator_tag)
	{
		/*
		if (n >= 0)
		{
			while (n--) ++i;
		}
		else
		{
			while (n++) --i;
		}
		*/
	}
	template<class _RAI, class _D>
	inline void __advance(_RAI& i, _D n, random_access_iterator_tag)
	{
		//i += n;
	}


	template<class _II,class _D>
	inline void advance(_II& i, _D n)
	{
		iterator_traits<_II>();
		typedef typename iterator_traits<_II>::iterator_category cate;
		__advance(i, n, cate());//类型名加括号 即对象
	}

}

my_vector.h

#include"my_iterator.h"

namespace zyq
{
	template<class _Ty>
	class my_vevtor
	{
	public:
		class iterator;
		class const_iterator;

		class const_iterator :public zyq::_Ranit<int, int> {};
		class iterator :public const_iterator {};

	};
}

my_list.h

#include"my_iterator.h"

namespace zyq
{
	template<class _Ty>
	class my_list
	{
	public:
		class iterator;
		class const_iterator;

		class const_iterator :public zyq::_Bidit<int, int>{};
		class iterator :public const_iterator {};
	};
}

my_hash.table.h

#include"my_iterator.h"


namespace zyq
{
	template<class _Ty>
	class my_hash_table
	{
	public:
		class iterator;
		class const_iterator;

		class const_iterator :public zyq::_Forit<_Ty, int> {};
		class iterator : public const_iterator {};

	};
}
#include"my_iterator.h"
#include"my_list.h"
#include"my_vector.h"
#include"my_hash_table.h"
using namespace std;


int main()
{
	zyq::my_list<int>::iterator it;
	zyq::my_vevtor<int>::iterator iv;
	zyq::my_hash_table<int>::iterator ih;
	zyq::advance(it, 5);
	zyq::advance(iv, 5);
	zyq::advance(ih, 5);


	return 0;
}

在这里插入图片描述
首先在调动yhp::advance(it,5); it 迭代器不断向上继承,最终继承为双向迭代器,并将其赋给 iterator_category

接着进入函数本体,iterator_traits<_II>::iterator_category cate;进行迭代器萃取,根据上一步我们获得了iterator_category就是一个双向迭代器类型

接着调动__advance() 函数本身,将双向迭代器类型传入,根据函数重载去使用双向迭代器的函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值