ASh*_*lly 13
指针可以起到这种作用. container.begin()
很容易,而且container.end()
不需要太多工作.
考虑
Value array[N];
typedef Value* iterator;
iterator array_begin(Value a[]){ return &a[0];}
iterator array_end(Value a[], int n){ return &a[n];}
iterator array_next(iterator i) { return ++i;}
iterator it = array_begin(a);
iterator end = array_end(a,N);
for (;it < end; it=array_next(it))
{
Value v = *it;
}
Run Code Online (Sandbox Code Playgroud)
对于列表等其他容器,可以使用NULL作为结尾.树也一样,但next
功能需要维持状态.(或迭代器是一个指向结构的指针,其状态通过调用更新next(it)
).
看一下链接列表。节点包含一个“下一个”指针,可用于迭代列表,其方式类似于 C++ 迭代器:
typedef struct Node {
...
struct Node *next;
} Node;
...
Node *iter, *firstNode, *nodeList;
/* set firstNode and populate nodeList */
for (iter = firstNode; iter != NULL; iter = iter->next) {
/* iterate through list */
}
Run Code Online (Sandbox Code Playgroud)
它不是 C++ 迭代器,但希望这能提供一种在 C 中实现此目的的方法。
如果您被允许在项目中使用 LGPL 代码,请查看 GLib,而不是重新发明轮子。GLib 还允许在源代码级别以相当可移植的方式进行开发。
看看g_list_first()
andg_list_next()
实现了列表上迭代器的功能。甚至还有一个 g_list_foreach()`
http://library.gnome.org/devel/glib/stable/glib-Doubly-Linked-Lists.html
归档时间: |
|
查看次数: |
22136 次 |
最近记录: |