C++ 函数的 STL 函数有哪些用于迭代器操作?

来源:Golang编程网作者:小鱼头衔:草根站长
导读:本期聚焦于小伙伴创作的《C++ 函数的 STL 函数有哪些用于迭代器操作?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++ 函数的 STL 函数有哪些用于迭代器操作?》有用,将其分享出去将是对创作者最好的鼓励。

在C++的STL标准库中,提供了一系列专门用于迭代器操作的通用函数,这些函数可以适配不同种类的迭代器,完成迭代器移动、距离计算、范围判断等常见操作,是编写泛型代码时的重要工具。

C++ 函数的 STL 函数有哪些用于迭代器操作?

常用STL迭代器操作函数

1. advance函数

advance函数用于将迭代器向前或向后移动指定的距离,它支持所有类型的迭代器,包括输入迭代器、前向迭代器、双向迭代器和随机访问迭代器。对于随机访问迭代器,移动操作是O(1)复杂度,其他类型的迭代器是O(n)复杂度。

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

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto it_vec = vec.begin();
    // 将迭代器向后移动2个位置
    std::advance(it_vec, 2);
    std::cout << "vector移动后的值: " << *it_vec << std::endl; // 输出3

    std::list<int> lst = {10, 20, 30, 40};
    auto it_lst = lst.begin();
    // 将迭代器向后移动3个位置
    std::advance(it_lst, 3);
    std::cout << "list移动后的值: " << *it_lst << std::endl; // 输出40
    return 0;
}

2. next函数

next函数用于获取迭代器移动指定距离后的新迭代器,它不会修改原迭代器,而是返回一个新的迭代器对象。该函数同样支持所有迭代器类型,C++11及之后版本可用。

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

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto it = vec.begin();
    // 获取it向后移动2个位置的新迭代器
    auto new_it = std::next(it, 2);
    std::cout << "原迭代器指向的值: " << *it << std::endl; // 输出1
    std::cout << "新迭代器指向的值: " << *new_it << std::endl; // 输出3
    return 0;
}

3. prev函数

prev函数用于获取迭代器向前移动指定距离后的新迭代器,同样不会修改原迭代器,返回新的迭代器对象。它要求迭代器至少是双向迭代器,C++11及之后版本可用。

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

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto it = vec.end();
    // 获取it向前移动1个位置的新迭代器
    auto new_it = std::prev(it, 1);
    std::cout << "新迭代器指向的值: " << *new_it << std::endl; // 输出5
    return 0;
}

4. distance函数

distance函数用于计算两个迭代器之间的距离,即从一个迭代器到另一个迭代器需要经过的元素个数。对于随机访问迭代器,计算是O(1)复杂度,其他类型是O(n)复杂度。

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

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    auto it1 = vec.begin();
    auto it2 = vec.end();
    // 计算两个迭代器的距离
    int dist = std::distance(it1, it2);
    std::cout << "vector迭代器距离: " << dist << std::endl; // 输出5

    std::list<int> lst = {10, 20, 30};
    auto lit1 = lst.begin();
    auto lit2 = lst.end();
    int ldist = std::distance(lit1, lit2);
    std::cout << "list迭代器距离: " << ldist << std::endl; // 输出3
    return 0;
}

5. begin和end函数

std::beginstd::end是C++11引入的通用函数,用于获取容器或数组的起始和尾后迭代器,它们可以适配普通数组、STL容器以及实现了begin和end方法的自定义类型。

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

int main() {
    int arr[] = {1, 2, 3, 4};
    // 获取普通数组的迭代器
    auto arr_begin = std::begin(arr);
    auto arr_end = std::end(arr);
    std::cout << "数组第一个元素: " << *arr_begin << std::endl; // 输出1

    std::vector<int> vec = {10, 20, 30};
    auto vec_begin = std::begin(vec);
    auto vec_end = std::end(vec);
    std::cout << "vector第一个元素: " << *vec_begin << std::endl; // 输出10
    return 0;
}

函数特性对比

以下是上述迭代器操作函数的核心特性对比:

函数名功能支持的迭代器类型是否修改原迭代器最低C++版本
advance移动迭代器指定距离所有迭代器类型C++98
next返回移动后的新迭代器所有迭代器类型C++11
prev返回向前移动后的新迭代器双向及以上迭代器C++11
distance计算两个迭代器的距离所有迭代器类型C++98
begin/end获取起始/尾后迭代器支持begin/end的类型C++11

使用注意事项

  • 使用advance移动迭代器时,要确保移动后的迭代器在容器的有效范围内,否则会导致未定义行为。
  • prev函数不能用于前向迭代器和输入迭代器,因为这两类迭代器不支持向后移动。
  • distance函数的第一个迭代器必须能够通过递增操作到达第二个迭代器,否则结果未定义。
  • 对于普通数组,std::beginstd::end会自动计算数组的大小,不需要手动传入长度。
这些STL迭代器操作函数的核心价值在于泛型编程,当代码需要处理多种不同类型的容器时,使用这些通用函数可以避免针对每种容器编写不同的迭代器操作逻辑,提升代码的复用性。

STL迭代器advancenextprev修改时间:2026-07-06 16:30:33

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