C语言中的迭代器

C语言中的迭代器,c,C,是否有人尝试过在C中提供对迭代器的支持。 我不是在寻找精确的C++ STL::迭代器,但是对于一些想法的最小支持将是我的好观点。 我正在开发类似stl的容器库,但支持很少,所以我需要这些容器中的这种功能 我期待着定义某些算法接口集(类似于STL)。例如sort,它将使用begin和end迭代器,并且应该与任何容器一起使用。您需要一种标准化的迭代器递增方式。在C++中,这只是重载 >操作符++()>代码>。您的容器需要一个关联函数来返回指向下一个元素的指针。这个递增函数需要作为指向任何可以在库中接

是否有人尝试过在C中提供对迭代器的支持。 我不是在寻找精确的C++ STL::迭代器,但是对于一些想法的最小支持将是我的好观点。 我正在开发类似stl的容器库,但支持很少,所以我需要这些容器中的这种功能


我期待着定义某些算法接口集(类似于STL)。例如sort,它将使用begin和end迭代器,并且应该与任何容器一起使用。

您需要一种标准化的迭代器递增方式。在C++中,这只是重载<代码> >操作符++()>代码>。您的容器需要一个关联函数来返回指向下一个元素的指针。这个递增函数需要作为指向任何可以在库中接受迭代器的通用例程的指针来传递


例如,如果我想编写一个从容器返回max元素的函数,我不仅需要比较函数(相当于
操作符如果允许在项目中使用LGPL代码,请查看GLib,而不是重新发明轮子。GLib还允许在源代码级别以非常可移植的方式进行开发

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


查看链接列表。节点包含一个“下一个”指针,它可以用来重复列表,以类似于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 */
}

它不是C++迭代器,但希望这能在C.中找到一种方法来解决这个问题:< P> >指针可以服务于这个函数。<代码>容器>()(代码)>很容易,并且<代码>容器(端)(<)/代码>不会占用太多的工作。 考虑

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;
}
值数组[N];
typedef值*迭代器;
迭代器数组_begin(值a[]){return&a[0];}
迭代器数组_end(值a[],int n){return&a[n];}
迭代器数组_next(迭代器i){return++i;}
迭代器it=array_begin(a);
迭代器端=数组_端(a,N);
for(;it

对于列表等其他容器,可以使用NULL作为结束。对于树也是如此,但是
next
函数需要维护状态。(或者迭代器是指向一个结构的指针,通过调用
next(it)
)更新状态。)

我发现了一个开源项目,它是C语言中的STL实现


这就是我想到的:

typedef struct PWDict PWDict;
typedef struct PWDictIterator PWDictIterator;

typedef struct PWDictImplementation
{
    PWDict *(*create)(const struct PWDictImplementation *impl, size_t elements);
    void (*destroy)(PWDict *dict);

    unsigned int (*size)(const PWDict *dict);
    unsigned int (*sizeInBytes)(const PWDict *dict);

    int (*get)(const PWDict *dict, const char *key, char *output, size_t size);
    int (*set)(PWDict *dict, const char *key, const char *value);

    PWDictIterator *(*iteratorCreate)(const PWDict *dict);
    void (*iteratorBegin)(PWDictIterator *it);
    void (*iteratorEnd)(PWDictIterator *it);
    void (*iteratorDestroy)(PWDictIterator *it);

    const char *(*iteratorGetKey)(const PWDictIterator *it);
    const char *(*iteratorGetValue)(const PWDictIterator *it);
    int (*iteratorSetValue)(PWDictIterator *it, const char *value);
    void (*iteratorNext)(PWDictIterator *it);
}
PWDictImplementation;

struct PWDict
{
    PWDictImplementation *impl;
};

struct PWDictIterator
{
    PWDict *dict; /* get iterator implementation from the dict implementation */
};
PW是我们的项目前缀。
我们只需要一本字典(字符串映射)类似容器。

C中的迭代器不是指针吗?@AShelly,但通常迭代器对是否存在另一个值有一些概念,而指针没有。为什么要达到这样的复杂程度呢,chrisaycock?定义迭代器数据结构的模块只会有一个接受addres的增量函数是当前迭代器的。你把东西混在一起了。链表,像数组一样,是一种数据结构。OP需要一个迭代器——它可以用来以统一的方式迭代不同的数据结构。我只是提供一个类比。在C中没有直接可用的东西,所以提供了链表的类比来说明这种情况是如何发生的ng可能会起作用。能说会道的LGPL,i.d.难道你不能(动态地)吗从非GPL代码链接到它?@delnan,你完全正确!我一直认为它在GPL下…LGPL绝对不错,但只是动态链接。对于一个简单的迭代器来说,这个基本框架是一个很好的起点。但是
array\u next
函数应该返回
(I+1)
++i
,因为
i++
将只返回
i
,而不会实际移动到下一项。