C++ STL源码分析——iterator分类

本文探讨了C++ STL中iterator遵循的原则,包括iterator_category、difference_type等五种参数设计,以及iterator的分类,如random_access_iterator_tag、bidirectional_iterator_tag等。还介绍了iterator_tag的继承关系及其对algorithm如distance的影响,展示了不同容器iterator类型的测试结果。
摘要由CSDN通过智能技术生成

【侯捷-SL体系结构内核分析-iterator】

目录:
iterator需要遵循的原则
iterator的‘萃取机’
iterator的分类
iterator_tag 的继承关系
iterator_tag对 algorithm的影响

iterator需要遵循的原则

先来看一段代码,目的是移动 iterator 若干距离:

template<class _Iter>
	using _Iter_cat_t = typename iterator_traits<_Iter>::iterator_category;
	
template<class _InIt,
	class _Diff>
	_CONSTEXPR17 void advance(_InIt& _Where, _Diff _Off)
	{
   	// increment iterator by offset, arbitrary iterators
		// we remove_const_t before _Iter_cat_t for better diagnostics if the user passes an iterator that is const
	_Advance1(_Where, _Off, _Iter_cat_t<remove_const_t<_InIt>>());
	}

template<class _RanIt,
	class _Diff>
	_CONSTEXPR17 void _Advance1(_RanIt& _Where, _Diff _Off, random_access_iterator_tag)
	{
   	// increment iterator by offset, random-access iterators
	_Where += _Off;
	}

template<class _BidIt,
	class _Diff>
	_CONSTEXPR17 void _Advance1(_BidIt& _Where, _Diff _Off, bidirectional_iterator_tag)
	{
   	// increment iterator by offset, bidirectional iterators
	for (; 0 < _Off; --_Off)
		{
   
		++_Where;
		}

	// the following warning is triggered if _Diff is unsigned
#pragma warning(suppress: 6294)	// Ill-defined for-loop: initial condition does not satisfy test.
								// Loop body not executed.
	for (; _Off < 0; ++_Off)
		{
   
		--_Where;
		}
	}

template<class _InIt,
	class _Diff>
	_CONSTEXPR17 void _Advance1(_InIt& _Where, _Diff _Off, input_iterator_tag)
	{
   	// increment iterator by offset, input iterators
	_STL_ASSERT(_Off 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值