在元素上拆分 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()
.
说,我有一个数组 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()
.