技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性
本节主要介绍STL六大部件中的Iterators迭代器.
在语言方面讲,容器是一个class template, 算法是一个仿函数, 分配器class template, 迭代器是一个class template, 适配器class template, 分配器class template
从图中我们可以看出算法是看不到容器的,容器跟算法的交互必要用迭代器做桥梁,那么迭代器是怎样让容器和算法满足各自的需求的呢?
我们先看一下都有哪些迭代器
struct input_iterator_tag{};//write-read迭代器 struct output_iterator_tag{};//read-only输出流 struct forward_iterator_tag : public input_iterator_tag{}//单向迭代器 forward_list multiset/map; struct bidirectional_iterator_tag : public input_iterator_tag{}//双向迭代器 hash list set map; struct random_access_iterator_tag : public input_iterator_tag{}//随机迭代器 array vector deque;
类图如下
下面我们验证一下各种容器的迭代器
这是测试代码
#include <iostream> #include <iterator> #include <array> #include <vector> #include <list> #include <set> #include <map> #include <forward_list> #include <deque> #include <unordered_set> #include <unordered_map> using namespace std; void _display_category(input_iterator_tag) { cout << "input_iterator_tag" << endl; } void _display_category(output_iterator_tag) { cout << "output_iterator_tag" << endl; } void _display_category(forward_iterator_tag) { cout << "forward_iterator_tag" << endl; } void _display_category(bidirectional_iterator_tag) { cout << "bidirectional_iterator_tag" << endl; } void _display_category(random_access_iterator_tag) { cout << "random_access_iterator_tag" << endl; } template<typename I> void display_ccategory(I iter) { typename iterator_traits<I>::iterator_category cagy; _display_category(cagy); } int main() { display_ccategory(array<int, 10>::iterator()); display_ccategory(vector<int>::iterator()); display_ccategory(list<int>::iterator()); display_ccategory(forward_list<int>::iterator()); display_ccategory(deque<int>::iterator()); cout << endl; display_ccategory(set<int>::iterator()); display_ccategory(multiset<int>::iterator()); display_ccategory(map<int,int>::iterator()); display_ccategory(multimap<int,int>::iterator()); cout << endl; display_ccategory(unordered_set<int>::iterator()); display_ccategory(unordered_multiset<int>::iterator()); display_ccategory(unordered_map<int,int>::iterator()); display_ccategory(unordered_multimap<int,int>::iterator()); return 0; }