C++ STL和泛型编程(三)----迭代器的分类(category)
一、迭代器的中介作用
- 容器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 <