说,我有一个数组T*array
和一个谓词p
,我想在匹配T**subs
的每个元素上将数组拆分为不同的子数组p
。 / p>
类似于:
typedef bool (*P) (T element);
T**subs(T*array,P p){....}
subs()
的代码怎么样?
请注意,代码只是伪代码,您可以在示例中使用array_length
等变量,因为我只想了解如何实现subs()
。
答案 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
的内存并且不会返回有关组长度的任何信息,但由于您只想了解如何解决此问题,我认为这应该是足够的起点,让你得到你想要的。