在元素上拆分 C 数组

Split C Array on element

说,我有一个数组 T*array 和一个谓词 p,我想在每个匹配 p 的元素上将数组拆分成不同的子数组 T**subs .

所以像这样:

typedef bool (*P) (T element);
T**subs(T*array,P p){....}

subs() 的代码是什么样子的?

请注意,代码只是伪代码,您可以在示例中使用 array_length 等变量,因为我只是想了解如何实现 subs()

比"what would the code look like"更重要的是问题"what data structure do you want/need to use?"

例如,如果需要在不改变原始值的情况下更改子数组,则需要将数组元素复制到新数组中。如果不更改子数组的值,则可以 return 将指针或索引数组 return 放入原始数组。或者指针数组是一个列表。

一旦确定了符合您要求的数据结构,就可以开发算法了。但是如果你的算法被证明是麻烦或缓慢的,你可能需要调整你的数据结构以允许更快的处理。

所以你看,你的问题需要很多 "design" 和你的决定,根据你的要求。

我们称其为回调函数,而不是predicate

typedef bool (*P) (T element);

T * * subs(T * array, P callback) {
    T * * retval = malloc(sizeof(T*) * max_groups); // either count before, or realloc as needed
    size_t group = 0;
    retval[group] = array;

    for (size_t i = 0; i < array_length; ++i) {
        if (callback(array[i])) {
            retval[++group]=array + i;
        }
    }

    return retval;
}

这重用了参数 array 的内存,并且 return 没有关于组长度的任何信息,但由于您只想了解如何解决这个问题,我认为这应该足以让你得到你想要的东西。

假设子数组之间没有间隙,您可以 return 检测到 M=N-2 大小为 N 的动态创建数组 T * result 的指针元素。

此数组需要 NULL 终止以指示其大小,即 result[N-1] 需要 NULL

result 的每个元素都指向源 array,表示子数组的开始(第一个元素)。

result[N-2] 点刚好超过最后一个元素。

子数组i的大小(对于i = {0 ... M})然后可以导出通过 result[i+1]-result[i].

没有复制,不需要额外的数组来指示子数组的大小。只需将源数组的大小传递给 subs().