C++怎么遍历容器 C++四种迭代器的用法详解

来源:建站教程作者:小雨头衔:草根站长
导读:本期聚焦于小伙伴创作的《C++怎么遍历容器 C++四种迭代器的用法详解》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++怎么遍历容器 C++四种迭代器的用法详解》有用,将其分享出去将是对创作者最好的鼓励。

在C++标准库中,迭代器是访问容器元素的核心机制,不同的容器支持不同类型的迭代器,而迭代器的分类决定了我们可以使用哪些操作来遍历和操作容器元素。C++的迭代器按功能从弱到强主要分为四种:前向迭代器、双向迭代器、随机访问迭代器和输入/输出迭代器,其中前四种是日常遍历容器时最常用到的类型。

C++怎么遍历容器 C++四种迭代器的用法详解

一、前向迭代器(forward_iterator)

前向迭代器是最基础的迭代器类型之一,它支持单向遍历,只能从容器起始位置向后移动到末尾位置,不能反向移动,也支持多次遍历同一个容器。这类迭代器通常对应单向链表等容器,比如std::forward_list

前向迭代器支持的核心操作包括:解引用获取元素、前置/后置自增移动到下一个元素、比较是否相等。下面是一个使用前向迭代器遍历std::forward_list的示例:

#include <iostream>
#include <forward_list>

int main() {
    // 创建单向链表并初始化元素
    std::forward_list<int> flist = {1, 2, 3, 4, 5};
    
    // 获取前向迭代器,从起始位置开始遍历
    std::forward_list<int>::iterator it;
    for (it = flist.begin(); it != flist.end(); ++it) {
        std::cout << *it << " "; // 解引用迭代器获取元素值
    }
    // 输出结果:1 2 3 4 5
    return 0;
}

二、双向迭代器(bidirectional_iterator)

双向迭代器在前向迭代器的基础上增加了反向移动的能力,既可以向后遍历,也可以向前遍历,但是仍然不支持随机访问(比如直接跳转到第n个元素)。常见的支持双向迭代器的容器有std::liststd::setstd::map等。

除了前向迭代器的所有操作外,双向迭代器还支持前置/后置自减操作,用于移动到前一个元素。下面是使用双向迭代器遍历std::list的示例,同时演示正向和反向遍历:

#include <iostream>
#include <list>

int main() {
    std::list<int> l = {10, 20, 30, 40};
    
    // 正向遍历
    std::cout << "正向遍历结果:";
    std::list<int>::iterator it;
    for (it = l.begin(); it != l.end(); ++it) {
        std::cout << *it << " ";
    }
    
    // 反向遍历
    std::cout << "n反向遍历结果:";
    std::list<int>::reverse_iterator rit;
    for (rit = l.rbegin(); rit != l.rend(); ++rit) {
        std::cout << *rit << " ";
    }
    // 输出结果:正向遍历结果:10 20 30 40 
    // 反向遍历结果:40 30 20 10
    return 0;
}

三、随机访问迭代器(random_access_iterator)

随机访问迭代器是功能最强的迭代器类型,它支持双向移动,还支持随机访问操作,比如可以直接通过迭代器加上偏移量跳转到任意位置,也支持迭代器之间的减法运算得到两个元素的距离。支持这类迭代器的容器有std::vectorstd::deque、原生数组等。

随机访问迭代器除了双向迭代器的所有操作外,还支持it + nit - nit1 - it2it[n]、比较大小等操作。下面是使用随机访问迭代器遍历std::vector的示例:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {5, 15, 25, 35, 45};
    
    // 普通正向遍历
    std::cout << "普通遍历:";
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << " ";
    }
    
    // 随机访问遍历,直接跳转到指定位置
    std::cout << "n随机访问第3个元素:" << vec.begin()[2] << std::endl;
    std::cout << "两个迭代器的距离:" << vec.end() - vec.begin() << std::endl;
    // 输出结果:普通遍历:5 15 25 35 45 
    // 随机访问第3个元素:25
    // 两个迭代器的距离:5
    return 0;
}

四、输入/输出迭代器(input_iterator/output_iterator)

输入迭代器和输出迭代器是更特殊的迭代器类型,主要用于输入输出场景,比如从流中读取数据或者向流中写入数据。输入迭代器只能单次遍历,每次解引用只能读取一次元素,之后迭代器就会失效;输出迭代器只能单次写入,每次解引用只能写入一次元素。

最常见的输入迭代器是std::istream_iterator,输出迭代器是std::ostream_iterator,下面是使用这两种迭代器从标准输入读取数据并输出到标准输出的示例:

#include <iostream>
#include <iterator>
#include <vector>

int main() {
    // 输入迭代器,从标准输入读取int类型数据到vector
    std::cout << "请输入多个整数,以空格分隔,按回车结束:" << std::endl;
    std::istream_iterator<int> in_it(std::cin);
    std::istream_iterator<int> end_it;
    std::vector<int> input_vec(in_it, end_it);
    
    // 输出迭代器,将vector中的元素输出到标准输出
    std::cout << "你输入的元素是:";
    std::ostream_iterator<int> out_it(std::cout, " ");
    std::copy(input_vec.begin(), input_vec.end(), out_it);
    return 0;
}

四种迭代器的特性对比

为了更清晰地区分四种迭代器的差异,我们可以通过下表对比它们的核心特性:

迭代器类型支持的操作适用容器示例
前向迭代器单向移动、解引用、相等比较std::forward_list
双向迭代器前向迭代器所有操作 + 双向移动std::list、std::set、std::map
随机访问迭代器双向迭代器所有操作 + 随机跳转、大小比较、距离计算std::vector、std::deque、原生数组
输入/输出迭代器单次读取/写入、单向移动std::istream_iterator、std::ostream_iterator

遍历容器的最佳实践

在实际开发中,除了直接使用迭代器遍历容器,C++11之后还引入了范围for循环,它本质上也是基于迭代器实现的,代码更简洁。比如遍历std::vector可以写成:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4};
    // 范围for循环遍历,底层自动使用迭代器实现
    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}

需要注意的是,范围for循环在遍历过程中如果修改了容器的结构(比如增加或删除元素),会导致迭代器失效,引发未定义行为,这时候就需要手动控制迭代器的移动逻辑,避免出现问题。

C++迭代器容器遍历forward_iteratorbidirectional_iterator修改时间:2026-07-16 14:51:40

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。