1.简介
迭代器模式是一种行为设计模式,它允许你顺序地遍历集合中的元素,而不需要暴露其底层的表示。在C语言中,由于没有类和对象的概念,实现迭代器模式需要使用函数指针、结构体等手段。
使用场景
- 当需要提供一种方法来访问一个容器对象的各个元素时,而又不想暴露该对象的内部细节。
- 在遍历过程中可能需要执行额外的操作(如过滤条件)。
2.通俗讲解
比如使用迭代器模式遍历一个整数数组,并且只打印出其中的偶数。
3.实战
3.1.代码
#include <stdio.h>
// 定义迭代器结构体
typedef struct {
int *current; // 当前元素的指针
int *end; // 数组末尾的指针
} Iterator;
// 创建迭代器
Iterator create_iterator(int *start, int *end) {
Iterator it = {start, end};
return it;
}
// 检查迭代器是否到达末尾
int is_done(const Iterator *it) {
return it->current >= it->end;
}
// 移动到下一个元素
void next(Iterator *it) {
++it->current;
}
// 获取当前元素
int current(const Iterator *it) {
return *it->current;
}
// 过滤函数
int is_even(int value) {
return value % 2 == 0;
}
// 主函数
int main() {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n = sizeof(arr) / sizeof(arr[0]);
// 创建迭代器
Iterator it = create_iterator(arr, arr + n);
// 遍历并打印偶数
while (!is_done(&it)) {
if (is_even(current(&it))) {
printf("%d ", current(&it));
}
next(&it);
}
printf("\n");
return 0;
}
3.2.代码解析
- 定义迭代器结构体:
Iterator
结构体包含了两个指针成员:current
和end
。current
指向当前元素,end
指向数组的结束位置。
- 创建迭代器:
- 函数
create_iterator
接受数组的起始和结束位置作为参数,并返回一个初始化好的迭代器。
- 函数
- 迭代器操作:
is_done
: 判断迭代器是否已经到达了数组的末尾。next
: 将迭代器的current
指针移动到下一个元素。current
: 返回当前迭代器所指向的元素。
- 过滤逻辑:
is_even
: 一个简单的函数用于判断一个整数是否为偶数。
- 主函数:
- 创建一个整型数组
arr
。 - 使用
create_iterator
创建一个迭代器。 - 使用
is_done
,next
和current
方法遍历数组。 - 使用
is_even
过滤并打印出偶数。
- 创建一个整型数组
3.3.代码运行
2 4 6 8 10