0

0

c++中迭代器(iterator)的用法_c++ STL迭代器类型与遍历方法

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-10-30 20:56:02

|

924人浏览过

|

来源于php中文网

原创

C++ STL迭代器是访问容器元素的工具,支持遍历、读取和修改。STL定义五种迭代器:输入、输出、前向、双向和随机访问迭代器,功能依次增强。vector、deque、array支持随机访问迭代器,list、set、map支持双向迭代器,unordered系列支持前向迭代器。使用begin()/end()获取正向迭代器,rbegin()/rend()获取反向迭代器。现代C++推荐使用范围for循环(如for(const auto& item : container))简化遍历。注意迭代器失效问题:vector插入或删除可能导致全部失效,erase应使用返回值更新迭代器。正确选择容器和迭代器类型可提升性能与安全性。

c++中迭代器(iterator)的用法_c++ stl迭代器类型与遍历方法

在C++ STL中,迭代器(iterator)是一种用于访问容器元素的工具,它类似于指针,可以指向容器中的某个元素,并支持一系列操作来遍历、读取或修改数据。使用迭代器可以让算法与具体容器解耦,提高代码的通用性和可维护性。

迭代器的基本类型

STL定义了五种主要的迭代器类型,按功能从弱到强排列

  • 输入迭代器(Input Iterator):只能向前移动,用于读取数据,如istream_iterator。
  • 输出迭代器(Output Iterator):只能向前移动,用于写入数据,如ostream_iterator。
  • 前向迭代器(Forward Iterator):可多次读写同一元素,只能单向遍历,如slist、unordered容器的迭代器。
  • 双向迭代器(Bidirectional Iterator):支持前后移动(++和--),如list、set、map等容器的迭代器。
  • 随机访问迭代器(Random Access Iterator):支持指针式操作,如+、-、[]、等,vector、deque、array的迭代器属于此类。

不同容器提供的迭代器类型不同,选择合适的容器有助于提升性能和功能支持。

常见容器的迭代器使用方法

以下是一些常用容器的迭代器遍历示例:

立即学习C++免费学习笔记(深入)”;

1. vector 使用迭代器遍历

vector支持随机访问迭代器,可以正向、反向遍历。

#include 
#include 
using namespace std;

vector vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
    cout << *it << " ";
}
// 输出:1 2 3 4 5
2. map 使用迭代器遍历

map的迭代器指向键值对(pair),通过first和second访问。

#include 
#include 
using namespace std;

map m = {{"Alice", 25}, {"Bob", 30}};
for (auto it = m.begin(); it != m.end(); ++it) {
    cout << it->first << ": " << it->second << endl;
}
3. 使用反向迭代器(reverse_iterator)

反向遍历用rbegin()和rend()。

for (auto rit = vec.rbegin(); rit != vec.rend(); ++rit) {
    cout << *rit << " ";
}
// 输出:5 4 3 2 1

现代C++中的简化写法

C++11以后引入了范围-based for循环auto关键字,使迭代更简洁:

牛面
牛面

牛面AI面试,大厂级面试特训平台

下载
// 推荐写法:简洁清晰
for (const auto& item : vec) {
    cout << item << " ";
}

for (const auto& [key, value] : m) {
    cout << key << ": " << value << endl;
}

这种方式底层仍使用迭代器,但语法更友好,适合大多数遍历场景。

迭代器失效问题

在操作容器时需注意迭代器可能失效:

  • vector插入元素可能导致所有迭代器失效(尤其是内存重分配时)。
  • erase()后原迭代器失效,应使用其返回值继续遍历。
  • map、set等节点式容器erase只使被删元素的迭代器失效。

正确使用erase:

for (auto it = vec.begin(); it != vec.end(); ) {
    if (*it % 2 == 0) {
        it = vec.erase(it); // erase返回下一个有效位置
    } else {
        ++it;
    }
}

基本上就这些。掌握迭代器的类型和使用方式,能让你更灵活地操作STL容器,写出高效且通用的C++代码。关键是理解不同容器支持的迭代器能力,避免越界和失效问题。不复杂但容易忽略细节。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

60

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

40

2025.11.27

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.11.24

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

404

2023.08.14

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

324

2023.10.09

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.5万人学习

React 教程
React 教程

共58课时 | 4万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号