在元素上拆分C数组

时间:2016-10-08 08:43:51

标签: c arrays split predicate

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

类似于:

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

subs()的代码怎么样?

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

3 个答案:

答案 0 :(得分:3)

比#34更重要;代码会是什么样的"问题是"您想要/需要使用什么数据结构?"

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

一旦确定了符合要求的数据结构,就可以开发算法。但是,如果您的算法结果很麻烦或很慢,您可能需要调整数据结构以便加快处理速度。

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

答案 1 :(得分:2)

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

此数组必须NULL终止以表示其大小,result[N-1]必须为NULL

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

result[N-2]点位于最后一个元素之外。

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

没有复制,没有额外的数组来表示子阵列'尺寸是必要的。只需要将源数组的大小传递给result[i+1]-result[i]

答案 2 :(得分:1)

我们称之为回调函数,而非谓词

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的内存并且不会返回有关组长度的任何信息,但由于您只想了解如何解决此问题,我认为这应该是足够的起点,让你得到你想要的。