C++ STL 迭代器

前言

要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

迭代器按照定义方式分成以下四种:

  • 正向迭代器,定义方法如下:
容器类名::iterator 迭代器名;
  • 常量正向迭代器,定义方法如下:
容器类名::const_iterator 迭代器名;
  • 反向迭代器,定义方法如下:
容器类名::reverse_iterator 迭代器名;
  • 常量反向迭代器,定义方法如下:
容器类名::const_reverse_iterator 迭代器名;

迭代器的用法

迭代器不使用取地址符(要与指针区分开),有迭代器的类型同时拥有返回迭代器的成员,比如beginend成员。

  • begin成员:负责返回指向第一个元素(或第一个字符)的迭代器
  • end成员:负责返回指向容器(或string对象)“尾元素的下一位置(one past the end)”的迭代器,即:该迭代器指示的是容器的一个本不存在的“尾后(off the end)”元素。所以又名:尾后迭代器(off-the-end iterator)简称尾迭代器(end iterator)(无实际意义,只是个标识而已)。

如果容器为空,则beginend返回的是同一个迭代器,都是尾后迭代器。

迭代器的常用操作如下:

代码操作
*iter反回迭代器iter所指元素
iter->mem解析引用iter并获取该元素名为mem的成员,等价于(*iter).mem
iter++++iteriter指示容器的下一个元素
iter----iteriter指示容器的上一个元素
iter1==iter2判断两个迭代器是否相等,如果两个迭代器指示的是同一个元素,或它们是同一个容器的尾后迭代器,则相等

不同容器的迭代器的功能

容器迭代器功能
vector随机访问
deque随机访问
list双向
setmultiset双向
mapmultimap双向
stack不支持迭代器
queue不支持迭代器
priority_queue不支持迭代器
### C++ STL 迭代器的使用方法与示例 #### 什么是迭代器C++ STL 中的迭代器是一个重要的概念,它提供了一种统一的方式来访问和遍历容器中的元素[^1]。无论底层容器是 `std::vector`、`std::list` 或其他类型,迭代器都能屏蔽这些差异,使得开发者能够专注于算法逻辑而非数据结构细节。 --- #### 基本语法与分类 迭代器分为多种类型,常见的有输入迭代器、输出迭代器、前向迭代器、双向迭代器以及随机访问迭代器。每种类型的迭代器支持的操作不同,具体取决于其功能设计[^2]。 以下是几种常见容器及其对应的迭代器类别: - **`std::vector`**: 支持随机访问迭代器。 - **`std::list`**: 支持双向迭代器。 - **`std::map` 和 `std::set`**: 支持双向迭代器。 --- #### 示例代码:基本迭代器用法 下面展示如何使用正向迭代器遍历一个简单的 `std::vector<int>` 容器: ```cpp #include <iostream> #include <vector> using namespace std; int main() { vector<int> v = {10, 20, 30}; // 正常方式遍历 for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) { cout << *it << " "; // 输出: 10 20 30 } cout << endl; return 0; } ``` 上述代码展示了如何利用 `begin()` 和 `end()` 方法获取迭代器范围,并通过解引用操作符 (`*`) 访问当前指向的元素。 --- #### 反向迭代器 除了常规的正向迭代器外,C++ 提供了反向迭代器用于逆序遍历容器的内容。可以通过调用 `rbegin()` 和 `rend()` 获取反向迭代器实例[^3]。 以下是一段演示反向迭代器使用的代码: ```cpp #include <iostream> #include <vector> using namespace std; int main() { vector<int> v = {10, 20, 30}; // 使用反向迭代器遍历 for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit) { cout << *rit << " "; // 输出: 30 20 10 } cout << endl; return 0; } ``` 此代码片段说明了如何借助 `rbegin()` 和 `rend()` 实现从最后一个元素到第一个元素的遍历过程。 --- #### 需要注意的问题 尽管迭代器非常强大,但在实际开发过程中也需要注意一些潜在陷阱。例如,在某些情况下直接比较地址可能引发错误行为。如下所示的例子即为非法写法[^4]: ```cpp // 错误示范 for(auto i = v.begin(); i < v.end(); ++i){ cout << *i; } ``` 原因在于 `<` 操作符并非所有迭代器类型都定义的行为;只有当迭代器属于随机访问类型时才允许此类比较。 --- #### 总结 掌握 C++ STL迭代器不仅有助于提高程序性能,还能增强代码可读性和通用性。无论是基础的正向迭代还是高级特性如反向迭代器的应用,都需要深入理解各种容器所对应的支持能力及限制条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值