GArray 可以存放任意类型的元素,并且大小随着元素的增加可以自动增长。
2:GArray结构
typedef struct {
gchar *data;
guint len;
} GArray;
3:GArray原型
GArray* g_array_new (gboolean zero_terminated,
gboolean clear_,
guint element_size);
GArray* g_array_sized_new (gboolean zero_terminated,
gboolean clear_,
guint element_size,
guint reserved_size);
#define g_array_append_val (a,v)
GArray* g_array_append_vals (GArray *array,
gconstpointer data,
guint len);
#define g_array_prepend_val (a,v)
GArray* g_array_prepend_vals (GArray *array,
gconstpointer data,
guint len);
#define g_array_insert_val (a,i,v)
GArray* g_array_insert_vals (GArray *array,
guint index_,
gconstpointer data,
guint len);
GArray* g_array_remove_index (GArray *array,
guint index_);
GArray* g_array_remove_index_fast (GArray *array,
guint index_);
GArray* g_array_remove_range (GArray *array,
guint index_,
guint length);
void g_array_sort (GArray *array,
GCompareFunc compare_func);
void g_array_sort_with_data (GArray *array,
GCompareDataFunc compare_func,
gpointer user_data);
#define g_array_index (a,t,i)
GArray* g_array_set_size (GArray *array,
guint length);
gchar* g_array_free (GArray *array,
gboolean free_segment);
4:GArray实例
#include <stdio.h>
#include <glib.h>
#include <glib/gprintf.h>
struct map {
int key;
char *value;
} m[10] = {
{1,"one"},
{2,"two"},
{3,"three"},
{4,"four"},
{5,"five"},
{6,"six"},
{7,"seven"},
{8,"eight"},
{9,"nine"},
{10,"ten"}
};
typedef struct map map;
static gint
sort(gconstpointer p1, gconstpointer p2)
{
gint32 a, b;
a = *(gint*)(p1);
b = *(gint*)(p2);
return (a > b ? +1 : a == b ? 0 : -1);
}
static gint
sort_r(gconstpointer p1, gconstpointer p2, gpointer user_data)
{
gint32 a, b;
a = *(gint*)(p1);
b = *(gint*)(p2);
return (a < b ? +1 : a == b ? 0 : -1);
}
static void
print(GArray *array)
{
gint i;
for (i = 0; i < array->len; i++)
g_printf("%d,", g_array_index(array, int, i));
g_printf("\n");
}
static void
test_array(void)
{
GArray *array = NULL;
gint i;
// GArray* g_array_new(gboolean zero_terminated, gboolean clear_, guint element_size);
array = g_array_new(FALSE, FALSE, sizeof(int));
// #define g_array_append_val(a,v)
for (i = 0; i < sizeof(m)/sizeof(m[0]); i++)
g_array_append_val(array, m[i].key);
g_printf("There should be '%d' items now.\t\tResult: %d.\n", 10, array->len);
g_printf("All of items:\n");
// #define g_array_index(a, t, i)
for (i = 0; i < sizeof(m)/sizeof(m[0]); i++)
g_printf("%d,", g_array_index(array, int, i));
g_printf("\n");
// GArray* g_array_remove_index(GArray *array, guint index_);
array = g_array_remove_index(array, 1);
g_printf("All of items[exclude the second item]:\n");
for (i = 0; i < sizeof(m)/sizeof(m[0])-1; i++)
g_printf("%d,", g_array_index(array, int, i));
g_printf("\n");
// GArray* g_array_remove_index_fast(GArray *array, guint index_);
array = g_array_remove_index_fast(array, 1);
g_printf("All of items[exclude the second item]:\n");
for (i = 0; i < sizeof(m)/sizeof(m[0])-1-1; i++)
g_printf("%d,", g_array_index(array, int, i));
g_printf("\n");
// GArray* g_array_remove_range(GArray *array, guint index_, guint length);
array = g_array_remove_range(array, 2, 2);
g_printf("All of items[after remove 2 items from the third item]:\n");
for (i = 0; i < sizeof(m)/sizeof(m[0])-1-1-2; i++)
g_printf("%d,", g_array_index(array, int, i));
g_printf("\n");
// void g_array_sort(GArray *array, GCompareFunc compare_func);
g_array_sort(array, sort);
g_printf("All of items[sorted]:\n");
for (i = 0; i < sizeof(m)/sizeof(m[0])-1-1-2; i++)
g_printf("%d,", g_array_index(array, int, i));
g_printf("\n");
// void g_array_sort_with_data(GArray *array, GCompareDataFunc compare_func, gpointer user_data);
g_array_sort_with_data(array, sort_r, NULL);
g_printf("All of items[sorted reversed]:\n");
for (i = 0; i < sizeof(m)/sizeof(m[0])-1-1-2; i++)
g_printf("%d,", g_array_index(array, int, i));
g_printf("\n");
int x[4] = {2,3,4,5};
// GArray* g_array_append_vals(GArray *array, gconstpointer data, guint len);
array = g_array_append_vals(array, x, 4);
g_printf("All of items[after append all 2,3,4,5]:\n");
for (i = 0; i < array->len; i++)
g_printf("%d,", g_array_index(array, int, i));
g_printf("\n");
g_printf("All of items[after prepend one by one 2,3,4,5]:\n");
// #define g_array_prepend_val(a,v)
for (i = 0; i < 4; i++)
g_array_prepend_val(array, x[i]);
print(array);
g_printf("All of items[after prepend all 2,3,4,5]:\n");
// GArray* g_array_prepend_vals(GArray *array, gconstpointer data, guint len);
array = g_array_prepend_vals(array, x, 4);
print(array);
int t = 0;
// #define g_array_insert_val(a, i, v)
g_array_insert_val(array, 0, t);
g_printf("All of items[after insert 0 at the first index]:\n");
print(array);
g_array_sort(array, sort);
g_printf("All of items[sorted]:\n");
print(array);
// gchar* g_array_free(GArray *array, gboolean free_segment);
g_array_free(array, TRUE);
}
int
main(void)
{
printf("BEGIN:\n************************************************************\n");
test_array();
printf("\n************************************************************\nDONE\n");
return 0;
}
5:结果
BEGIN:
************************************************************
There should be '10' items now. Result: 10.
All of items:
1,2,3,4,5,6,7,8,9,10,
All of items[exclude the second item]:
1,3,4,5,6,7,8,9,10,
All of items[exclude the second item]:
1,10,4,5,6,7,8,9,
All of items[after remove 2 items from the third item]:
1,10,6,7,8,9,
All of items[sorted]:
1,6,7,8,9,10,
All of items[sorted reversed]:
10,9,8,7,6,1,
All of items[after append all 2,3,4,5]:
10,9,8,7,6,1,2,3,4,5,
All of items[after prepend one by one 2,3,4,5]:
5,4,3,2,10,9,8,7,6,1,2,3,4,5,
All of items[after prepend all 2,3,4,5]:
2,3,4,5,5,4,3,2,10,9,8,7,6,1,2,3,4,5,
All of items[after insert 0 at the first index]:
0,2,3,4,5,5,4,3,2,10,9,8,7,6,1,2,3,4,5,
All of items[sorted]:
0,1,2,2,2,3,3,3,4,4,4,5,5,5,6,7,8,9,10,
************************************************************
DONE