问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

【C++】深入理解迭代器(Iterator)

创作时间:
作者:
@小白创作中心

【C++】深入理解迭代器(Iterator)

引用
CSDN
1.
https://blog.csdn.net/2201_75539691/article/details/145014269

博客主页:[小ᶻ☡꙳ᵃⁱᵍᶜ꙳]*本文专栏:C++*

文章目录

  • 💯前言
  • 💯什么是迭代器?
  • 迭代器与指针的比较
  • 💯std::string 中的迭代器
  • 示例代码与图示分析
  • 运行结果:
  • 图示说明:
  • 小提示
  • 💯正序遍历与逆序遍历
  • 正序遍历
  • 示例代码
  • 运行结果
  • 逆序遍历
  • 示例代码
  • 运行结果
  • 注意
  • 💯修改字符串内容
  • 示例代码
  • 运行结果
  • 解释
  • 💯拓展:迭代器的更多功能
  • 迭代器类型
  • 常用 STL 算法与迭代器
  • 示例:查找特定字符
  • 💯小结

💯前言

  • C++ 是一门功能强大的编程语言,其标准库(STL, Standard Template Library)提供了多种高效的工具来处理数据。其中,迭代器(Iterator)是一种极为重要的工具,可以帮助开发者优雅地操作容器,遍历、访问和修改数据。迭代器的作用类似于指针,但比指针更强大和灵活。本文将以
    std::string
    为例,结合代码和图示,从基本概念到实际应用,带领读者深入理解 C++ 中迭代器的核心功能和用法。
    C++ 参考手册

💯什么是迭代器?

迭代器(Iterator)是 C++ 标准模板库中的一种对象,专为遍历容器中的元素而设计。它的工作方式类似于指针,但具备更多功能。
迭代器的主要特点包括:

  • 抽象化:通过统一的接口操作不同类型的容器(如
    vector

    string

    list
    等)。
  • 灵活性:支持顺序遍历、逆序遍历,以及访问和修改容器中的元素。
  • 安全性:迭代器相比裸指针更安全,更符合现代 C++ 的编程规范。
    在迭代器的使用过程中,特别需要注意访问迭代器指向的值时必须解引用(
  • 操作符)。

迭代器与指针的比较

迭代器和指针有许多相似之处,例如它们都可以通过递增(
++
)、递减(

)、解引用(

  • )来访问和操作数据。但是,迭代器是针对容器设计的,它们具有更强的抽象能力,可以屏蔽容器的底层实现,从而使代码更通用和易维护。

💯

std::string
中的迭代器
C++ 中的
std::string
提供了多种迭代器,用于遍历字符串中的字符和修改字符串的内容。下面是我们将重点讨论的两个基本方法:

begin()
:返回指向字符串第一个字符的迭代器。

end()
:返回指向字符串最后一个字符的下一个位置的迭代器。

示例代码与图示分析

让我们通过具体的代码和图示来理解
begin()

end()
的用法。

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "abcdef";
    string::iterator it1 = s.begin();
    string::iterator it2 = s.end();
    cout << (it1 < it2) << endl;
    cout << it1 - it2 << endl;
}

运行结果:

1
-6

图示说明:

+---+---+---+---+---+---+---+
| a | b | c | d | e | f | \0|
+---+---+---+---+---+---+---+
^                       ^
it1                     it2

小提示:

  • 迭代器的比较运算符(如 <)可以用来判断两个迭代器是否指向同一个位置。
  • 迭代器的减法运算符(如 -)可以用来计算两个迭代器之间的距离。

💯正序遍历与逆序遍历

正序遍历

示例代码:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "abcdef";
    for (string::iterator it = s.begin(); it != s.end(); ++it) {
        cout << *it << endl;
    }
}

运行结果:

a
b
c
d
e
f

逆序遍历

示例代码:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "abcdef";
    for (string::reverse_iterator it = s.rbegin(); it != s.rend(); ++it) {
        cout << *it << endl;
    }
}

运行结果:

f
e
d
c
b
a

注意:

  • 逆序遍历使用的是 reverse_iterator 类型,而不是普通的 iterator 类型。
  • rbegin() 返回指向字符串最后一个字符的迭代器,rend() 返回指向字符串第一个字符的前一个位置的迭代器。

💯修改字符串内容

示例代码:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s = "abcdef";
    for (string::iterator it = s.begin(); it != s.end(); ++it) {
        *it = 'X';
    }
    cout << s << endl;
}

运行结果:

XXXXXX

解释:

  • 通过解引用迭代器(*it),可以直接修改字符串中的字符。

💯拓展:迭代器的更多功能

迭代器类型

C++ 标准库提供了多种迭代器类型,包括:

  • InputIterator:只能向前读取数据。
  • OutputIterator:只能向前写入数据。
  • ForwardIterator:支持向前遍历和多次读取。
  • BidirectionalIterator:支持双向遍历。
  • RandomAccessIterator:支持随机访问。

常用 STL 算法与迭代器

许多 STL 算法都使用迭代器作为参数,例如:

  • find():查找特定元素。
  • sort():排序容器中的元素。
  • copy():复制容器中的元素。

示例:查找特定字符

#include <iostream>
#include <string>
#include <algorithm> // 包含 find 函数
using namespace std;

int main() {
    string s = "abcdef";
    string::iterator it = find(s.begin(), s.end(), 'c');
    if (it != s.end()) {
        cout << "Found 'c' at position: " << distance(s.begin(), it) << endl;
    } else {
        cout << "'c' not found" << endl;
    }
}

运行结果:

Found 'c' at position: 2

💯小结

迭代器是 C++ 标准库中一个非常重要的概念,它提供了一种统一的方式来遍历和操作容器中的元素。通过迭代器,开发者可以编写更安全、更灵活的代码。掌握迭代器的使用对于学习和使用 C++ 标准库至关重要。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号