C++ STL和泛型编程(三)----迭代器的分类(category)

本文探讨了C++ STL中迭代器的分类,包括random_access_iterator_tag、bidirectional_iterator_tag、forward_iterator_tag等,并阐述了iterator_category如何影响算法,如distance和advance。此外,还讨论了iterator_category在算法源码中的暗示以及与type traits的关系。
摘要由CSDN通过智能技术生成

一、迭代器的中介作用

  • 容器Container是class template
  • 算法Algorithm是function template
  • 迭代器Iterator是class template
  • 仿函数Functor是class template
  • 适配器Adapter是class template
  • 分配器Allocator是class template

在这里插入图片描述
Algorithms是看不见Containers的,只能从Iterators(由Containers提供)取得所需信息。因而Iterators必须能够回答Algorithms的所有提问,才能搭配该Algorithm的所有操作!

所以便引出了以下Iterators的分类去搭配对应的Algorithm使用。

二、各种容器的iterators的iterator_category

// 五种iterator category
struct input_iterator_tag{
   };
struct output_iterator_tag{
   };
struct forward_iterator_tag: public input_iterator_tag{
   }; // 单向链表指针迭代器
struct bidirectional_iterator_tag: public forward_iterator_tag{
   }; // 双向链表指针迭代器
struct random_access_iterator_tag: public bidirectional_iterator_tag{
   }; // 任意方向链表指针迭代器

五种iterator category之间的关系如图所示:
在这里插入图片描述

  • 各种容器的iterators的iterator_category

在这里插入图片描述random_access_iterator_tag类型

在这里插入图片描述bidirectional_iterator_tag类型

在这里插入图片描述forward_iterator_tag类型

在这里插入图片描述bidirectional_iterator_tag类型
(其底部是rb_tree实现,而节点之间是双向指向的)

在这里插入图片描述forward_iterator_tag类型 or bidirectional_iterator_tag类型
(因为其底部实现的hashtable的链表可以是单向的也可以是双向的)

#include<typeinfo>  // typeid

void _display_category(random_access_iterator_tag){
   
	cout << "random_access_iterator" << endl;
}
void _display_category(bidirectional_iterator_tag){
   
	cout << "bidirectional_iterator" << endl;
}
void _display_category(forward_iterator_tag){
   
	cout << "forward_iterator" << endl;
}
void _display_category(output_iterator_tag){
   
	cout << "output_iterator" << endl;
}
void _display_category(input_iterator_tag){
   
	cout << "input_iterator" << endl;
}
template<typename I>
void <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值