使用迭代器如何实现指针前移或后移
相同的效果?
如果将数据保存在数组变量中,那么将如何使用已有的冒泡排序算法呢?由于数组也是容器,因此只要实现基于数组的迭代器即可,详见程序清单3.59。
程序清单3.59 使用数组实现迭代器接口
1 typedef int element_type_t;
2
3 static void __array_iterator_next(iterator_t *p_iter)
4 {
5 (*(element_type_t **)(p_iter))++; // 让迭代器指向下一个数据
6 }
7
8 static void __array_iterator_prev(iterator_t *p_iter)
9 {10 (*(element_type_t **)(p_iter))--; // 让迭代器指向前一个数据
11 }
12
13 void array_iterator_if_get(iterator_if_t *p_if)
14 {
15 iterator_if_init(p_if, __array_iterator_next, __array_iterator_prev);
16 }基于新的迭代器,同样可以直接使用冒泡排序算法实现排序,详见程序清单3.60。
程序清单3.60 使用数组、算法和迭代器
1 #include
2 #include "iterator.h"
3
4 static int __visit(void *p_arg, iterator_t it)
5 {
6 printf("%d ", *(int *)it);
7 return 0;
8 }
9
10 static int __compare(iterator_t it1, iterator_t it2)
11 {12 return *(int *)it1 - *(int *)it2;
13 }
14
15 static void __swap(iterator_t it1, iterator_t it2)
16 {
17 int data = *(int *)it2;
18 *(int *)it2 = *(int *)it1;
19 *(int *)it1 = data;
20 }
2122 int main(int argc, char *argv[])
23 {
24 iterator_if_t iterator_if;
25 int a[] = {5, 3, 2, 4, 1};
26 array_iterator_if_get(&iterator_if);
27
28 printf("\nBefore bubble sort:\n");
29 iter_foreach(&iterator_if, a, a + 5, __visit, NULL);
30
31 iter_sort(&iterator_if, a, a + 5, __compare, __swap);
32
33 printf("\nAfter bubble sort:\n");34 iter_foreach(&iterator_if, a, a + 5, __visit, NULL);
35 return 0;
36 }由此可见,通过迭代器冒泡排序算法也得到了复用。如果算法库里有几百个函数,那么只要实现迭代器接口的2个函数即可,从而达到复用代码的目的。显然,迭代器是一种更灵活的遍历行为,它可以按任意顺序访问容器中的元素,而且不会暴露容器的内部结构。
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)