微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 使用迭代器如何实现指针前移或后移

使用迭代器如何实现指针前移或后移

时间:08-27 来源:周立功单片机 点击:

相同的效果?

如果将数据保存在数组变量中,那么将如何使用已有的冒泡排序算法呢?由于数组也是容器,因此只要实现基于数组的迭代器即可,详见程序清单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  }

21

22  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个函数即可,从而达到复用代码的目的。显然,迭代器是一种更灵活的遍历行为,它可以按任意顺序访问容器中的元素,而且不会暴露容器的内部结构。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top