0

0

c++中迭代器(iterator)是什么_STL迭代器概念与使用方法详解

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-09-22 19:26:01

|

979人浏览过

|

来源于php中文网

原创

迭代器是C++ STL中用于访问容器元素的通用机制,类似于指针,可遍历和操作数据。它统一了不同容器的访问方式,支持解引用、递增、递减、比较等操作。STL定义五类迭代器:输入、输出、前向、双向和随机访问迭代器,功能由弱到强。vector、list、map等容器提供begin()、end()等方法获取迭代器,用于正向或反向遍历。C++11支持auto简化声明,范围for循环底层也基于迭代器实现。使用时需注意避免解引用end()、容器修改导致迭代器失效等问题,尤其是插入删除后原迭代器可能无效,引发未定义行为。迭代器是STL算法与容器之间的桥梁,广泛应用于sort、find等算法中,掌握其用法可提升C++编程效率。

c++中迭代器(iterator)是什么_stl迭代器概念与使用方法详解

迭代器(Iterator)是C++ STL中用于访问容器元素的一种通用机制,它类似于指针,可以指向容器中的某个元素,并通过递增、递减等操作遍历整个容器。理解迭代器是掌握STL使用的关键一步。

迭代器的基本概念

迭代器是一种抽象的概念,它将“遍历”和“访问”数据的方式统一起来。不同的容器(如vector、list、set等)内部结构不同,但都可以通过迭代器以相同的方式进行访问。

你可以把迭代器看作是一个指向容器中元素的“游标”,通过它可以读取或修改元素值,并能移动到下一个或上一个位置。

每种STL容器都定义了自己的迭代器类型,例如:

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

  • vector::iterator:用于 vector 容器
  • list::iterator:用于 list 容器
  • map::iterator:用于 map 容器

所有迭代器都支持一些基本操作:

  • *it:解引用,获取当前指向的元素值
  • ++it 或 it++:向前移动一位
  • --it 或 it--:向后移动一位(部分迭代器不支持)
  • it1 == it2:判断两个迭代器是否指向同一位置
  • it1 != it2:判断是否指向不同位置

常见迭代器类型

根据功能强弱,STL将迭代器分为五类:

  • 输入迭代器(Input Iterator):只能读取一次数据,单向移动(如istream_iterator)
  • 输出迭代器(Output Iterator):只能写入数据,单向移动(如ostream_iterator)
  • 前向迭代器(Forward Iterator):可多次读写,仅支持 ++ 操作(如slist、unordered容器)
  • 双向迭代器(Bidirectional Iterator):支持 ++ 和 --,可前后移动(如list、set、map)
  • 随机访问迭代器(Random Access Iterator):支持指针算术运算,如 +n、-n、[n] 等(如vector、deque)

功能由弱到强,vector 的迭代器是最强大的之一。

迭代器的使用方法

大多数容器提供以下成员函数来获取迭代器:

燕雀Logo
燕雀Logo

为用户提供LOGO免费设计在线生成服务

下载
  • begin():返回指向第一个元素的迭代器
  • end():返回指向最后一个元素后一个位置的迭代器(即尾后迭代器)
  • rbegin() / rend():反向迭代器,用于逆序遍历

示例:用迭代器遍历vector

#include 
#include 
using namespace std;

int main() { vector nums = {1, 2, 3, 4, 5};

for (vectorzuojiankuohaophpcnintyoujiankuohaophpcn::iterator it = nums.begin(); it != nums.end(); ++it) {
    cout zuojiankuohaophpcnzuojiankuohaophpcn *it zuojiankuohaophpcnzuojiankuohaophpcn " ";
}
cout zuojiankuohaophpcnzuojiankuohaophpcn endl;

return 0;

}

C++11 起可用 auto 简化写法:

for (auto it = nums.begin(); it != nums.end(); ++it) {
    cout << *it << " ";
}

范围for循环(底层仍使用迭代器):

for (const auto& val : nums) {
    cout << val << " ";
}

注意事项与常见错误

使用迭代器时要注意以下几点:

  • 不要对 end() 进行解引用 —— 它不指向有效元素
  • 容器修改后(如插入、删除),原有迭代器可能失效
  • 不同容器的迭代器能力不同,比如 vector 不支持 -- 操作在某些情况下会出错
  • 避免使用已失效的迭代器,否则引发未定义行为

示例:迭代器失效问题

vector v = {1, 2, 3, 4};
auto it = v.begin();
v.push_back(5);  // 可能导致内存重新分配,原 it 失效
cout << *it;     // 错误!使用了失效的迭代器

基本上就这些。迭代器是连接算法和容器的桥梁,STL中的很多算法(如sort、find、copy)都依赖迭代器工作。掌握它的使用方式,能让你更高效地编写C++代码。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

387

2023.09.04

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相关内容,阅读专题下面的文章了解更多详细内容。

59

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

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

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

403

2023.08.14

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

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

324

2023.10.09

Java编译相关教程合集
Java编译相关教程合集

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

9

2026.01.21

热门下载

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

精品课程

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

共94课时 | 7.2万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 13.1万人学习

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

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