使用g_array_sort函数

时间:2011-03-28 07:21:11

标签: glib

我需要使用函数g_array_sort(GArray *array, GCompareFunc *func),但我不理解第二个参数。

请告诉我应如何调用它,如果可能的话,请附上示例示例....

3 个答案:

答案 0 :(得分:3)

g_array_sort ()的第二个参数是指向函数的指针。如果你查看GCompareFunc的文档,你会发现它是一个带两个指针并返回一个int的函数:

gint (*GCompareFunc) (gconstpointer a, gconstpointer b);

文档还告诉你这个函数应该做什么:

  

如果第一个值在第二个值之前,则函数应返回负整数,如果它们相等则返回0,如果第一个值在第二个值之后,则返回正整数。

由于您没有指定您在数组中存储的数据类型,因此我将使用字符串。你的排序函数看起来像这样:

int my_string_sort_function (gconstpointer a, gconstpointer b)
{
    char *str_a = (char *)a;
    char *str_b = (char *)b;

    return strcmp (str_a, str_b);
}

如果您在数组中存储数字,则可以执行类似

的操作
int my_int_sort_function (gconstpointer a, gconstpointer b)
{
    int int_a = GPOINTER_TO_INT (a);
    int int_b = GPOINTER_TO_INT (b);

    return int_a - int_b;
}

将这些功能与g_array_sort

一起使用
g_array_sort (my_array, my_int_sort_function);

答案 1 :(得分:1)

这是一个开源库,因此您可以查看g_array_sort()本身的代码。只需输入g_array_sort到Google's code search,您就会得到代码。

在那里你可以看到这个函数实际上调用了libc的qsort(3)并将你感兴趣的函数传递给qsort不变。

现在,Linux的qsort man page有一个很好的qsort使用示例。

答案 2 :(得分:1)

为iain的答案添加一个例子。

这是一个显示GArray函数效果的示例,包括'g_array_sort()'。您可以看到排序后,int数组按升序列出:

/*
 * file: garray_test.c
 * compile: gcc -o g_array garray_test.c `pkg-config --cflags --libs glib-2.0`
 */

#include <glib.h>

void display_array(GArray *array, int len, const char *prompt)
{
    int i = 0;

    printf("%s: \n", prompt);
    for (i = 0; i < len; i++) {
        printf("%d ", g_array_index(array, int, i));
    }
    printf("\n");
}

int my_int_sort_function (gconstpointer a, gconstpointer b)
{
    int * int_a = (int *) a;
    int * int_b = (int *) b;

    return (*int_a) - (*int_b);
}

int main(int argc, char *argv[])
{
    GArray *array = NULL;
    int i = 0;
    int cur_arr_len = 0;
    int len = 0;

    array = g_array_new(FALSE, TRUE, sizeof(int));
    printf("Current length of array is %d\n", array->len);

    len = 0;
    for (i = 10; i < 15; i++) {
        g_array_append_val(array, i);
        len++;
    }
    cur_arr_len += len;
    display_array(array, cur_arr_len, "Create array");

    int app_data[] = {30, 40, 50, 60};
    int app_len = sizeof(app_data) / sizeof(int);

    g_array_append_vals(array, app_data, app_len);
    cur_arr_len += app_len;
    display_array(array, cur_arr_len, "After append values 30 40 50 60");

    len = 0;
    for (i = 1; i < 4; i++) {
        g_array_prepend_val(array, i);
        len++;
    }
    cur_arr_len += len;
    display_array(array, cur_arr_len, "After prepend value 1 2 3");

    int prepend_data[] = {-10, -20, -30, -40};
    int prepend_len = sizeof(prepend_data) / sizeof(int);

    g_array_prepend_vals(array, prepend_data, prepend_len);
    cur_arr_len += prepend_len;
    display_array(array, cur_arr_len, "After prepend values -10 -20 -30 -40");

    int data = 100;
    g_array_insert_val(array, 5, data);
    cur_arr_len += 1;
    display_array(array, cur_arr_len, "After insert 100 at index 5");

    g_array_remove_index(array, 5);
    cur_arr_len -= 1;
    display_array(array, cur_arr_len, "After remove value at index 5");

    g_array_remove_index_fast(array, 10);
    cur_arr_len -= 1;
    display_array(array, cur_arr_len, "After remove value at index 10 fast");

    g_array_sort (array, my_int_sort_function);
    display_array(array, cur_arr_len, "Try to sort the array");

    g_array_free(array, TRUE);
}

上述代码的结果:

Current length of array is 0
Create array: 
10 11 12 13 14 
After append values 30 40 50 60: 
10 11 12 13 14 30 40 50 60 
After prepend value 1 2 3: 
3 2 1 10 11 12 13 14 30 40 50 60 
After prepend values -10 -20 -30 -40: 
-10 -20 -30 -40 3 2 1 10 11 12 13 14 30 40 50 60 
After insert 100 at index 5: 
-10 -20 -30 -40 3 100 2 1 10 11 12 13 14 30 40 50 60 
After remove value at index 5: 
-10 -20 -30 -40 3 2 1 10 11 12 13 14 30 40 50 60 
After remove value at index 10 fast: 
-10 -20 -30 -40 3 2 1 10 11 12 60 14 30 40 50 
Try to sort the array: 
-40 -30 -20 -10 1 2 3 10 11 12 14 30 40 50 60