迭代器是干嘛的
移动遍历的机制
数组遍历元素,指针*p++
思考结构体怎么使用指针遍历元素?
典型的迭代器用法
(1)代码实战,用迭代器来实现遍历array
(2)begin()和end()方法是得到容器遍历的开始和结尾的套路化方法
std::array<int, 5> arr = {1, 2, 3, 4, 5};
for (auto it = arr.begin(); it != arr.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
迭代器的几个细节问题
const与非const
begin和end返回可读可写的迭代器,而cbegin和cend返回const的只读迭代器
int test070806() {
std::array<int, 5> arr = {1, 2, 3, 4, 5};
//读:
for (auto it = arr.begin(); it != arr.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
//写:
int i = 9;
// error: assignment of read-only location ‘* it’
// for (auto it = arr.cbegin(); it != arr.cend(); ++it) {
for (auto it = arr.begin(); it != arr.end(); ++it) {
*it = i++;
}
//读:
// array<int, 3>::iterator it;
array<int, 3>::const_iterator it;
for (it = arr.cbegin(); it != arr.cend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
begin和end的半开半闭区间
(1)begin返回第0个元素的迭代器(类似于C数组的首元素首地址指针)
(2)end指向的不是末尾元素的迭代器,而是末尾元素的(实际不存在的)下一个元素的迭代器
(3)前闭后开区间,经常记做[begin end),这样设计是为了写循环遍历时方便
正向和逆向迭代器
std::array<int, 5> arr = {1, 2, 3, 4, 5};
//读:
for (auto it = arr.rbegin(); it != arr.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
迭代器越界会怎么样
编译时不审查,运行时会崩溃,不管是正向还是逆向迭代器,++不到end,–不到begin,就不会越界
STL的不同类型迭代器
C++17前共有5种迭代器:
- 输入迭代器(Input Iterator)
:保证能单次读出,只能++,不能–,输入迭代器适用于单通只读型算法。 - 用于单向读取数据。
- 只能一次读取一个元素,且不允许修改元素。
- 典型用例包括读取输入流(如std::istream_iterator)或遍历只读容器。
- 输出迭代器(Output Iterator)
:只能++,不能–,输出迭代器适用于单通只写型算法。 - 用于单向写入数据。
- 只能一次写入一个元素,且不能读取或多次写入同一个位置。
- 典型用例包括写入输出流(如std::ostream_iterator)或将数据写入容器。
- 前向迭代器(Forward Iterator)
:只能++走不能–走(就是单向的) - 结合了输入和输出迭代器的特性。
- 可以多次读取和写入同一个位置,且可以向前遍历。
- 典型用例包括std::forward_list和哈希表等。
- 双向迭代器(Bidirectional Iterator)
:双向迭代器。既能++也可以–,双向移动。 - 在前向迭代器的基础上,增加了向后遍历的能力。
- 典型用例包括std::list、std::set和std::map等。
- 随机访问迭代器(Random Access Iterator)
:随机访问迭代器。能双向移动,并且可以单次跨越多个元素移动。 - 具有双向迭代器的所有特性,并且支持常数时间的随机访问。
- 支持算术运算符(如加减运算)和关系运算符(如小于、大于)。
- 典型用例包括std::vector、std::deque和原生数组。
新增1种迭代器
contiguousIterator,连续迭代器。所指向的逻辑相邻元素也在内存中物理上相邻。
特点
- 连续存储: 连续迭代器保证指向的元素在内存中是连续存储的,这意味着可以安全地使用指针算术运算来访问元素。
- 更高效: 因为底层数据是连续的,算法可以进行更高效的优化,比如直接使用内存拷贝(memcpy)等。
使用场景
连续迭代器主要用于容器和数据结构,其中数据在内存中是连续存储的,如std::array、std::vector、C风格数组等。
学习记录,侵权联系删除。
来源:朱老师物联网大课堂