当前位置: 首页 > 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.zskr.cn/news/3078.html

相关文章:

  • 在GA中添加Tag-GetDynamicSpecSourceTags().AddTag(NewTag)
  • 296、贾生
  • LLM 应用开发中的常见模式
  • 可爱的二维数据结构们
  • 202005_CTFHUB_Redis流量
  • langchain学习之路
  • 通义灵码产品演示: 数据库设计与数据分析
  • ubuntu 24编译安装libssl.so.1.0.0
  • Task2:利用 Basnet 将Task1中的所有图片转化为显著性图片
  • 让天下没有难查的故障:2025 阿里云 AI 原生编程挑战赛正式启动
  • kuka机器人程序备份
  • AI 测试工具20款
  • VMware安装NOI linux系统教程
  • 近期理工类学术会议推荐 | 人工智能、工业设计、电气工程、传感器技术、环境工程等EI会议合集
  • 史上最薄iPhone 17 Air登场!极致轻薄背后藏有哪些妥协?
  • 网页转小程序封装机系统介绍
  • P12021 面包题
  • 彻底解决docker:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled 报错
  • 7. Job与CronJob
  • drawio
  • bootstrap-select插件在webpack中点击无响应
  • 重复从网页复制文字到编辑器的Autohotkey自动化代码
  • 202404_古剑山杯_数独
  • mac book怎么切换windows系统
  • 用Android(Kotlin)+ ML Kit:移动端英文数字验证码识别实战
  • 详细介绍:10:00开始面试,10:06就出来了,问的问题有点变态。。。
  • 第02周 预习:Java基础语法2、面向对象入门 - hohohoho--
  • 第六届机器学习与计算机应用国际学术会议(ICMLCA 2025)
  • # 数论知识讲解与C++代码:唯一分解定理、辗转相除法、埃氏筛与线性筛(含质因数分解示例)
  • 【初赛】无向图度数性质 - Slayer