C语言的迭代器

Avi*_*ash 8 c

有没有人尝试在C中提供对迭代器的支持.我不是在寻找精确的C++ STL :: Iterator但是对于某些想法的最小支持对我来说是个好点.

我正在开发像stl一样的容器库,但支持很少,所以我需要在这些容器中使用这种功能.

我期待定义某些算法接口集(类似于STL).例如sort,它将采用开始和结束迭代器,并且应该适用于任何容器.

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)).

  • 这个基本的骨架是一个很好的开始一个简单的迭代器.但是`array_next`函数应该返回`(i + 1)`或`++ i`,因为`i ++`只会返回`i`并且实际上不会移动到下一个项目. (5认同)

Ale*_*lds 5

看一下链接列表。节点包含一个“下一个”指针,可用于迭代列表,其方式类似于 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 中实现此目的的方法。

  • 你把东西搞混了。链表与数组一样,是一种数据结构。OP 需要一个迭代器 - 它可以用于以统一的方式迭代不同的数据结构。 (4认同)

jde*_*aan 2

如果您被允许在项目中使用 LGPL 代码,请查看 GLib,而不是重新发明轮子。GLib 还允许在源代码级别以相当可移植的方式进行开发。

看看g_list_first()andg_list_next()实现了列表上迭代器的功能。甚至还有一个 g_list_foreach()`

http://library.gnome.org/devel/glib/stable/glib-Doubly-Linked-Lists.html