如何对通用 (void*) 数组进行排序?
how to sort a generic (void*) array?
传入了一个void*类型的数组。我想对数组进行排序,但我需要能够创建一个临时值来切换数组的各个部分。我该怎么做?
所以,我通过这个使用 memcpy 切换值:
memcpy(temp, first, size);
memcpy(first, cur, size);
memcpy(cur, temp, size);
我试图在其中切换 first 和 cur 元素。 (是的,它们是指针)。这是正确的吗?因为我的程序出错了,尽管我不确定是不是因为这个。 (错误输出不准确。)
您的实现没问题,但与您的 相关,您的函数修饰应该是这样的;
编辑:“l”替换为“byteLength”
void swap(void *a, void *b, size_t byteLength) {
void *tmp = malloc(byteLength);
memcpy(tmp, a, byteLength);
memcpy(a, b, byteLength);
memcpy(b, tmp, byteLength);
free(tmp);
return;
}
并且,如果您要交换字符串(即 (char *)
指针);
void swap(void **a, void **b) {
void *tmp;
tmp = *a;
*a = *b;
*b = tmp;
return;
}
...
...
{
char *a = "some string";
char *b = "some other string";
...
...
// somewhere in the calling function
swap(&a, &b);
}
它是泛型编程的核心。如果你想对一个 void*
指针数组进行排序(每个指针可以指向任何数据类型,通常是它的用户定义结构),你需要一个相等的 function/function 指针。让我们假设我们有以下结构:
typedef struct
int foo;
....
....
}s_ex;
我们正在通过在堆上分配每个结构来初始化一个 s_ex
结构数组。
void* arr[];
我们想将这个 void*
指针数组传递给排序函数,可以对任何数据类型进行排序的通用函数:
函数签名:
void gen_sort(void **user_array,int n, int(*fp_equality)(void*,void*));
唯一知道如何比较两项的是调用者(构建这些数据类型的人)!所以他需要传递一个知道如何比较两个项目的函数 fp_equality 和 return 结果作为 int
(如 strcmp
)。
排序的算法不是问题,你可以决定什么样的排序算法适合你的程序。为了简单起见,我采用冒泡排序:
void gen_sort(void **user_array,int n; int(*fp_equality)(void*,void*))
{
int i, j;
for (i = 0; i < n-1; i++)
// Last i elements are already in place
for (j = 0; j < n-i-1; j++)
if(fp_equality(arr[j],arr[j+1])>0) /*like: (arr[j] > arr[j+1])*/
swap(&arr[j], &arr[j+1]);
}
void swap(void** lhs, void** rhs)
{
void* temp = *lhs;
*lhs=*rhs;
*rhs=temp;
}
传入了一个void*类型的数组。我想对数组进行排序,但我需要能够创建一个临时值来切换数组的各个部分。我该怎么做?
所以,我通过这个使用 memcpy 切换值:
memcpy(temp, first, size);
memcpy(first, cur, size);
memcpy(cur, temp, size);
我试图在其中切换 first 和 cur 元素。 (是的,它们是指针)。这是正确的吗?因为我的程序出错了,尽管我不确定是不是因为这个。 (错误输出不准确。)
您的实现没问题,但与您的
编辑:“l”替换为“byteLength”
void swap(void *a, void *b, size_t byteLength) {
void *tmp = malloc(byteLength);
memcpy(tmp, a, byteLength);
memcpy(a, b, byteLength);
memcpy(b, tmp, byteLength);
free(tmp);
return;
}
并且,如果您要交换字符串(即 (char *)
指针);
void swap(void **a, void **b) {
void *tmp;
tmp = *a;
*a = *b;
*b = tmp;
return;
}
...
...
{
char *a = "some string";
char *b = "some other string";
...
...
// somewhere in the calling function
swap(&a, &b);
}
它是泛型编程的核心。如果你想对一个 void*
指针数组进行排序(每个指针可以指向任何数据类型,通常是它的用户定义结构),你需要一个相等的 function/function 指针。让我们假设我们有以下结构:
typedef struct
int foo;
....
....
}s_ex;
我们正在通过在堆上分配每个结构来初始化一个 s_ex
结构数组。
void* arr[];
我们想将这个 void*
指针数组传递给排序函数,可以对任何数据类型进行排序的通用函数:
函数签名:
void gen_sort(void **user_array,int n, int(*fp_equality)(void*,void*));
唯一知道如何比较两项的是调用者(构建这些数据类型的人)!所以他需要传递一个知道如何比较两个项目的函数 fp_equality 和 return 结果作为 int
(如 strcmp
)。
排序的算法不是问题,你可以决定什么样的排序算法适合你的程序。为了简单起见,我采用冒泡排序:
void gen_sort(void **user_array,int n; int(*fp_equality)(void*,void*))
{
int i, j;
for (i = 0; i < n-1; i++)
// Last i elements are already in place
for (j = 0; j < n-i-1; j++)
if(fp_equality(arr[j],arr[j+1])>0) /*like: (arr[j] > arr[j+1])*/
swap(&arr[j], &arr[j+1]);
}
void swap(void** lhs, void** rhs)
{
void* temp = *lhs;
*lhs=*rhs;
*rhs=temp;
}