C++ STL 迭代器Iterator、五种迭代器类别

您所在的位置:网站首页 茶的种类有哪几种类型 C++ STL 迭代器Iterator、五种迭代器类别

C++ STL 迭代器Iterator、五种迭代器类别

2024-07-16 19:10| 来源: 网络整理| 查看: 265

前言

最近在看《STL源码剖析》,并且也跟着在实现algorithm.h这个头文件。里面的算法基本都是对迭代器所指向的容器区间内的元素做操作,因此这些算法的泛型模板参数基本都有迭代器类型。针对不同的算法,对迭代器类型的要求也不同,本篇博客我就简单介绍一下C++中的五种迭代器类别。

五种迭代器类别的关系

首先介绍五种迭代器类别:

输入迭代器input iterator输出迭代器output iterator前向迭代器forward iterator双向迭代器bidirectional iterator随机访问迭代器random-access iterator

它们的继承关系如下图所示,越往下的迭代器功能越多:

在这里插入图片描述

以下表格主要是对它们的功能做个汇总。感觉表格的方式能够比较好对它们做对比、发现它们之间的联系:

迭代器类型能够进行的操作备注输入迭代器input iterator1. 比较两个迭代器是否相等(==、!=)。2. 前置和后置递增运算(++)(意味着它是单向移动的)。3. 读取元素的解引用运算符(*)。只能读元素,也就是解引用只能出现在赋值运算符的右边。4. 箭头运算符(->),解引用迭代器,并提取对象的成员。5. 只能用于单遍扫描算法。无。输出迭代器output iterator1. 比较两个迭代器是否相等(==、!=)。2. 前置和后置递增运算(++)(意味着它是单向移动的)。3. 读取元素的解引用运算符(*)。只能写元素,也就是解引用只能出现在赋值运算符的左边。4. 箭头运算符(->),解引用迭代器,并提取对象的成员。5. 只能用于单遍扫描算法。与输入迭代器的操作相似,只不过输入变成了输出。前向迭代器forward iterator与输入迭代器的操作相似,只不过输入变成了输出。1. 比较两个迭代器是否相等(==、!=)。2. 前置和后置递增运算(++)(意味着它是单向移动的)。3. 读取元素的解引用运算符(*)。可写也可读。4. 箭头运算符(->),解引用迭代器,并提取对象的成员。5. 能用于多遍扫描算法。输入迭代器与输出迭代器操作的结合。双向迭代器bidirectional iterator1. 比较两个迭代器是否相等(==、!=)。2. 前置和后置递增运算(++)。3. 前置和后置递减运算(–)(意味着它是双向移动的)。3. 读取元素的解引用运算符(*)。可写也可读。4. 箭头运算符(->),解引用迭代器,并提取对象的成员。5. 能用于多遍扫描算法。支持所有前向迭代器操作的基础上,支持递减运算符,也就是支持双向移动。随机访问迭代器random-access iterator1. 比较两个迭代器是否相等(==、!=),以及比较两个迭代器相对位置的关系运算符(=)。2. 前置和后置递增运算(++)。3. 支持和一个整数值的加减运算(+、+=、-、-=)。4. 两个迭代器上的减法运算符(-),得到两个迭代器的距离。5. 前置和后置递减运算(–)(意味着它是双向移动的)。6. 读取元素的解引用运算符(*)。可写也可读。7. 箭头运算符(->),解引用迭代器,并提取对象的成员。8. 支持下标运算符(iter[n]),与*(iter[n])等价,访问距离起始迭代器n个距离的迭代器指向的元素。9. 能用于多遍扫描算法。在支持双向移动的基础上,支持前后位置的比较、随机存取、直接移动n个距离。 使用案例

这里就在我自己实现的algorithm.h中找几个使用了以上几种迭代器类型的典型函数来介绍。

replace函数,如果迭代器区间内的元素等于旧值,则将其换为新值。这个过程需要读元素的值,也需要写元素的值,所以迭代器类型最低应该为前向迭代器ForwardIterator。可以使用更高级的迭代器,但是最低级只能用前向迭代器。

// replace,旧值换成新值 template void replace(ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value) { for (; first != last; ++first) { if (*first == old_value) *first = new_value; } }

merge函数,将两个有序序列合并,并输出到结果迭代器指向的序列。两个输入序列上的迭代器只负责对元素进行读,一个输出序列上的迭代器只负责对元素进行写,所以输入序列上的迭代器最低应该为输入迭代器InputIterator,输出序列上的迭代器最低应该为输出迭代器OutputIterator。

// merge,将两个有序序列进行合并,返回结果序列最后一个元素的下一个位置 // 版本1,operatornext); return *this; } // 后缀自增 // 返回的是临时对象,所以不能返回引用 self operator++(int) { self tmp = *this; // this->node = (link_type)(node->next); ++*this; return tmp; } // 前缀自减 self& operator--() { node = (link_type)(node->prev); return *this; } // 后缀自减 self operator--(int) { self tmp = *this; --*this; return tmp; } };


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3