当前位置: 首页 > news >正文

C++ - STL - 迭代器

什么是迭代器?🤔

想象一下,你有一排整齐的书架,上面放着很多书。你现在想从第一本开始,一本一本地看书名。你怎么做呢?

你会用手指指着第一本书,看完书名后,手指移动到下一本书,再看书名,这样一直指到最后一本书。

在C++的STL中,迭代器就是你的"手指"!它用来"指向"容器(比如数组、列表等)中的元素,然后你可以通过移动迭代器来访问所有元素。

最简单的迭代器用法

1. 获取迭代器

每个容器都有两个重要的迭代器:

  • begin() - 指向第一个元素

  • end() - 指向最后一个元素的下一个位置(不是最后一个元素!)

#include <iostream>
#include <vector>
using namespace std;
int main() {vector<int> numbers = {10, 20, 30, 40, 50};// 获取指向第一个元素的迭代器auto it = numbers.begin();// 获取指向"结尾后一个位置"的迭代器auto end_it = numbers.end();return 0;
}

2. 用迭代器访问元素

用 * 符号来获取迭代器指向的元素值(就像用 * 获取指针指向的值一样):

vector<int> numbers = {10, 20, 30, 40, 50};
auto it = numbers.begin();cout << *it << endl;  // 输出:10(第一个元素)

3. 移动迭代器

++ 让迭代器指向下一个元素:

vector<int> numbers = {10, 20, 30, 40, 50};
auto it = numbers.begin();cout << *it << endl;  // 输出:10
it++;                 // 移动到下一个元素
cout << *it << endl;  // 输出:20
it++;                 // 再移动一次
cout << *it << endl;  // 输出:30

实际使用例子 ✨
例子1:遍历vector的所有元素

#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> scores = {85, 92, 78, 90, 88};// 从第一个元素开始auto it = scores.begin();// 一直循环,直到到达结尾while (it != scores.end()) {cout << "分数: " << *it << endl;it++;  // 移动到下一个元素}return 0;
}

输出结果:

text
分数: 85
分数: 92
分数: 78
分数: 90
分数: 88

例子2:更方便的遍历方法(推荐!)
C++提供了更简单的写法,不需要手动操作迭代器:

vector<int> scores = {85, 92, 78, 90, 88};// 超级简单的写法!
for (int score : scores) {cout << "分数: " << score << endl;
}// 这个循环背后其实就是用迭代器实现的
// 只是编译器帮我们处理了迭代器的细节

例子3:遍历字符串的每个字符

#include <iostream>
#include <string>
using namespace std;int main() {string name = "Hello";for (char c : name) {cout << "字符: " << c << endl;}return 0;
}

输出结果:

text
字符: H
字符: e
字符: l
字符: l
字符: o

为什么要用迭代器?🎯

统一访问方式:不管是什么容器(vector、list、set等),都可以用相同的方式遍历

安全:比用下标访问更安全,不容易越界

灵活:可以方便地配合STL算法使用

总结一下 📝

操作 代码 说明
获取开始迭代器 容器.begin() 指向第一个元素
获取结束迭代器 容器.end() 指向最后一个元素的下一个位置
访问元素 *迭代器 获取迭代器指向的元素值
移动到下一个 迭代器++ 指向下一个元素
检查是否结束 迭代器 != 容器.end() 判断是否遍历完所有元素

以上内容均来自deepseek

http://www.wxhsa.cn/company.asp?id=2018

相关文章:

  • MATLAB的智能扫地机器人工作过程仿真
  • linux redis 8.2.1软件开机启动redis.service与etc下的rc.local配置2种方式
  • 在GA中添加Tag-GetDynamicSpecSourceTags().AddTag(NewTag)
  • python如何在函数中使用全局变量?
  • 296、贾生
  • ubuntu 24.04部署mysql8.0.41(glibc2.17)
  • C++ - STL - 键值对pair
  • 第四天学习:LSTM
  • MATLAB的稀疏自编码器实现
  • 题解:P2157 [SDOI2009] 学校食堂
  • LLM 应用开发中的常见模式
  • vue3 与 element-plus
  • 可爱的二维数据结构们
  • 网络安全相关职业
  • 202005_CTFHUB_Redis流量
  • langchain学习之路
  • 通义灵码产品演示: 数据库设计与数据分析
  • win10安装mysql,MySQL5.7详细教程
  • 第二周作业
  • ubuntu 24编译安装libssl.so.1.0.0
  • 9月8-13日小记 - L
  • Task2:利用 Basnet 将Task1中的所有图片转化为显著性图片
  • 代码随想录算法训练营第一天| 704.二分查找、27.移除元素、977.有序数组的平方
  • 让天下没有难查的故障:2025 阿里云 AI 原生编程挑战赛正式启动
  • kuka机器人程序备份
  • AI 测试工具20款
  • VMware安装NOI linux系统教程
  • 强制横屏 ios
  • 张量链式法则(下篇):揭秘Transpose、Summation等复杂算子反向传播,彻底掌握深度学习求导精髓!
  • 详细介绍:QT初探TCP(四)