[C++系列] 49. C++迭代器(STL迭代器)iterator详解
发布日期:2021-05-12 23:13:46 浏览次数:22 分类:精选文章

本文共 1894 字,大约阅读时间需要 6 分钟。

C++ STL 迭代器详解

1. 迭代器概述

在 C++ 标准图书馆(STL)中,迭代器(iterator)是连接容器与算法的重要桥梁。它允许我们通过统一的接口操作各种顺序容器和关联容器中的元素。迭代器类似于指针,但它提供了更高级别的操作,适用于各种容器类型。

迭代器的核心作用是提供对容器元素的访问和操作能力。通过迭代器,我们可以高效地遍历、读取和修改容器中的元素,而无需直接操作容器内部的数据结构。

2. 迭代器的定义与类型

迭代器的定义方式因容器类型而异。常见的迭代器类型包括:

2.1 正向迭代器

  • 定义container::iterator iter_name;
  • 特点:支持读取和写入操作,仅支持自增(++)操作。

2.2 常量正向迭代器

  • 定义container::const_iterator iter_name;
  • 特点:与正向迭代器类似,但只支持读取操作。

2.3 反向迭代器

  • 定义container::reverse_iterator iter_name;
  • 特点:反转了正向迭代器的操作方向,++ 运算将迭代器指向前一个元素。

2.4 常量反向迭代器

  • 定义container::const_reverse_iterator iter_name;
  • 特点:与反向迭代器类似,但只支持读取操作。

3. 迭代器的操作与用法

迭代器的操作是其核心功能。以下是迭代器常见操作的示例:

3.1 基本操作

  • 读取元素*iter 返回迭代器指向的元素。
  • 移动操作++iter(或 iter++)使迭代器指向下一个元素。

3.2 反向迭代器的特殊性

  • 正向迭代器++iter 指向下一个元素。
  • 反向迭代器++iter 指向前一个元素。

3.3 实际应用示例

以下程序展示了如何使用迭代器遍历和修改容器中的元素:

#include 
#include
using namespace std;
int main() {
vector
v;
for (int i = 0; i < 5; ++i) {
v.push_back(i);
}
vector
::iterator iter = v.begin();
for (iter = v.begin(); iter != v.end(); ++iter) {
cout << *iter << " ";
*iter *= 2;
}
vector
::reverse_iterator rev_iter = v.rbegin();
for (rev_iter = v.rbegin(); rev_iter != v.rend(); ++rev_iter) {
cout << *rev_iter << " ";
}
return 0;
}

程序输出结果为:0 1 2 3 48 6 4 2 0

4. 迭代器的高级功能

迭代器的功能不仅限于基本操作,还支持高级操作:

4.1 高级移动操作

  • advance(iter, n):将迭代器 iter 前进 n 个元素。
  • distance(iter1, iter2):计算两个迭代器之间的距离。

4.2 元素交换

  • iter_swap(iter1, iter2):交换两个迭代器指向的元素。

5. 迭代器适配器

迭代器适配器允许迭代器与其他 STL 算法配合使用。常见的适配器包括插入迭代器、反向迭代器和流迭代器。

5.1 插入迭代器

插入迭代器用于将新元素插入到容器中。例如,insert_iterator 可以将元素插入到指定位置。

5.2 反向迭代器

反向迭代器提供从后向前的遍历方式。例如,rbegin() 返回最后一个元素的迭代器,rend() 返回第一个元素前面的迭代器。

5.3 流迭代器

流迭代器将输入输出流(如 istreamostream)当作数据源或接收器。例如,istream_iterator 可以从输入流读取数据。

6. 迭代器的应用场景

迭代器在 STL 中广泛应用于各种算法中。例如:

  • 排序算法:如 sort() 函数依赖于随机访问迭代器。
  • 查找算法:如 find() 函数使用迭代器进行元素查找。

通过选择合适的迭代器类型,可以实现对不同容器的高效操作。

上一篇:[每日一题] 5. 字符串中找出连续最长的数字串(字符串、模拟、贪心)
下一篇:[C++系列] 50. 迭代器及string类OJ练习

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年05月22日 07时42分24秒