技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性

本节主要介绍STL六大部件中的Iterators迭代器.

STL标准库-迭代器

在语言方面讲,容器是一个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;

 类图如下

 STL标准库-迭代器

下面我们验证一下各种容器的迭代器

STL标准库-迭代器

 

这是测试代码

#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;
}
View Code

相关文章: