*引用本文请注明来自 blog.csdn.net/wtz1985
在上一篇文章中,已经介绍了为什么要实现容器和怎样实现容器,这章将要介绍的是----怎样在容器里把算法分离出来,在容器里,只是实现了基本接口定义,可是对于具体的操作,比如移动到一下结点、比较两个结点的值等,容器并没有实现。从容器中把这些算法分离出来就是所谓的迭代器(iterator)。下面将是一些代码的接口实现:
1、接口定义。
- /*-------- iterator.h --------*/
- #ifndef _ITERATOR_H
- #define _ITERATOR_H
- struct _Iterator;
- typedef struct _Iterator Iterator;
- typedef void (*IteratorNextFunc)(Iterator* thiz);
- typedef void (*IteratorPrevFunc)(Iterator* thiz);
- typedef void (*IteratorAdvanceFunc)(Iterator* thiz, size_t off_set);
- typedef void (*IteratorBeginFunc)(Iterator* thiz);
- typedef void (*IteratorEndFunc)(Iterator* thiz);
- typedef int (*IteratorCompareFunc)(Iterator* x, Iterator* y);
- typedef void (*IteratorSetFunc)(Iterator* thiz, void* data);
- typedef void* (*IteratorGetFunc)(Iterator* thiz);
- typedef void (*IteratorDestroyFunc)(Iterator* thiz);
- struct _Iterator
- {
- IteratorNextFunc next;
- IteratorPrevFunc prev;
- IteratorAdvanceFunc advance;
- IteratorBeginFunc begin;
- IteratorEndFunc end;
- IteratorCompareFunc compare;
- IteratorSetFunc set;
- IteratorGetFunc get;
- IteratorDestroyFunc destroy;
- };
- static inline void iterator_next(Iterator* thiz)
- {
- assert(thiz != NULL && thiz->next != NULL);
- thiz->next(thiz);
- return ;
- }
- static inline void iterator_prev(Iterator* thiz)
- {
- assert(thiz != NULL && thiz->prev != NULL);
- thiz->prev(thiz);
- return ;
- }
- static inline void iterator_advance(Iterator* thiz, size_t off_set)
- {
- assert(thiz != NULL && thiz->advance != NULL);
- thiz->advance(thiz, off_set);
- return ;
- }
- .......
- #endif
2、不同的接口实现:
链表方式:
- /*--------iterator_list.h---------*/
- #ifndef _ITERATOR_LIST_H
- #define _ITERATOR_LIST_H
- #include "iterator.h"
- Iterator* iterator_list_create(DList* thiz);
- #endif
动态数组方式:
- /*--------iterator_vector.h---------*/
- #ifndef _ITERATOR_VECTOR_H
- #define _ITERATOR_VECTOR_H
- #include "iterator.h"
- Iterator* iterator_vector_create(Vector* thiz);
- #endif
上面是迭代器接口的实现,具体的操作就不在这实现了。有了容器和迭代器这两个中间接口,就可以很自由的选择适合的结构实现自己的函数。有写的不好的地方,希望多指教。
~~END~~