Glib实例学习(4)动态数组

转载自:http://blog.chinaunix.net/space.php?uid=25696269&do=blog&id=1102621

1:概述
GArray 可以存放任意类型的元素,并且大小随着元素的增加可以自动增长。

2:GArray结构

  
  
  
  
  1. typedef struct {  
  2.   gchar *data;  
  3.   guint len;  
  4. } GArray; 
3:GArray原型
  
  
  
  
  1. GArray* g_array_new (gboolean zero_terminated,  
  2.                                                          gboolean clear_,  
  3.                                                          guint element_size);  
  4. GArray* g_array_sized_new (gboolean zero_terminated,  
  5.                                                          gboolean clear_,  
  6.                                                          guint element_size,  
  7.                                                          guint reserved_size);  
  8. #define g_array_append_val (a,v)  
  9. GArray* g_array_append_vals (GArray *array,  
  10.                                                          gconstpointer data,  
  11.                                                          guint len);  
  12. #define g_array_prepend_val (a,v)  
  13. GArray* g_array_prepend_vals (GArray *array,  
  14.                                                          gconstpointer data,  
  15.                                                          guint len);  
  16. #define g_array_insert_val (a,i,v)  
  17. GArray* g_array_insert_vals (GArray *array,  
  18.                                                          guint index_,  
  19.                                                          gconstpointer data,  
  20.                                                          guint len);  
  21. GArray* g_array_remove_index (GArray *array,  
  22.                                                          guint index_);  
  23. GArray* g_array_remove_index_fast (GArray *array,  
  24.                                                          guint index_);  
  25. GArray* g_array_remove_range (GArray *array,  
  26.                                                          guint index_,  
  27.                                                          guint length);  
  28. void g_array_sort (GArray *array,  
  29.                                                          GCompareFunc compare_func);  
  30. void g_array_sort_with_data (GArray *array,  
  31.                                                          GCompareDataFunc compare_func,  
  32.                                                          gpointer user_data);  
  33. #define g_array_index (a,t,i)  
  34. GArray* g_array_set_size (GArray *array,  
  35.                                                          guint length);  
  36. gchar* g_array_free (GArray *array,  
  37.                                                          gboolean free_segment); 

4:GArray实例
  
  
  
  
  1. #include <stdio.h>  
  2.  
  3. #include <glib.h>  
  4. #include <glib/gprintf.h>  
  5.  
  6. struct map {  
  7.     int key;  
  8.     char *value;  
  9. } m[10] = {  
  10.     {1,"one"},  
  11.     {2,"two"},  
  12.     {3,"three"},  
  13.     {4,"four"},  
  14.     {5,"five"},  
  15.     {6,"six"},  
  16.     {7,"seven"},  
  17.     {8,"eight"},  
  18.     {9,"nine"},  
  19.     {10,"ten"}  
  20. };  
  21. typedef struct map map;  
  22.  
  23. static gint  
  24. sort(gconstpointer p1, gconstpointer p2)  
  25. {  
  26.     gint32 a, b;  
  27.       
  28.     a = *(gint*)(p1);  
  29.     b = *(gint*)(p2);  
  30.  
  31.     return (a > b ? +1 : a == b ? 0 : -1);  
  32. }  
  33.  
  34. static gint  
  35. sort_r(gconstpointer p1, gconstpointer p2, gpointer user_data)  
  36. {  
  37.     gint32 a, b;  
  38.       
  39.     a = *(gint*)(p1);  
  40.     b = *(gint*)(p2);  
  41.  
  42.     return (a < b ? +1 : a == b ? 0 : -1);  
  43. }  
  44.  
  45. static void 
  46. print(GArray *array)  
  47. {  
  48.     gint i;  
  49.     for (i = 0; i < array->len; i++)  
  50.         g_printf("%d,", g_array_index(array, int, i));  
  51.     g_printf("\n");  
  52. }  
  53.  
  54. static void 
  55. test_array(void)  
  56. {  
  57.     GArray *array = NULL;  
  58.     gint i;  
  59.  
  60. // GArray* g_array_new(gboolean zero_terminated, gboolean clear_, guint element_size);  
  61.     array = g_array_new(FALSE, FALSE, sizeof(int));  
  62. // #define g_array_append_val(a,v)  
  63.     for (i = 0; i < sizeof(m)/sizeof(m[0]); i++)  
  64.         g_array_append_val(array, m[i].key);  
  65.  
  66.     g_printf("There should be '%d' items now.\t\tResult: %d.\n", 10, array->len);  
  67.     g_printf("All of items:\n");  
  68. // #define g_array_index(a, t, i)  
  69.     for (i = 0; i < sizeof(m)/sizeof(m[0]); i++)  
  70.         g_printf("%d,", g_array_index(array, int, i));  
  71.     g_printf("\n");  
  72.  
  73. // GArray* g_array_remove_index(GArray *array, guint index_);  
  74.     array = g_array_remove_index(array, 1);  
  75.     g_printf("All of items[exclude the second item]:\n");  
  76.     for (i = 0; i < sizeof(m)/sizeof(m[0])-1; i++)  
  77.         g_printf("%d,", g_array_index(array, int, i));  
  78.     g_printf("\n");  
  79.  
  80. // GArray* g_array_remove_index_fast(GArray *array, guint index_);  
  81.     array = g_array_remove_index_fast(array, 1);  
  82.     g_printf("All of items[exclude the second item]:\n");  
  83.     for (i = 0; i < sizeof(m)/sizeof(m[0])-1-1; i++)  
  84.         g_printf("%d,", g_array_index(array, int, i));  
  85.     g_printf("\n");  
  86.  
  87. // GArray* g_array_remove_range(GArray *array, guint index_, guint length);  
  88.     array = g_array_remove_range(array, 2, 2);  
  89.     g_printf("All of items[after remove 2 items from the third item]:\n");  
  90.     for (i = 0; i < sizeof(m)/sizeof(m[0])-1-1-2; i++)  
  91.         g_printf("%d,", g_array_index(array, int, i));  
  92.     g_printf("\n");  
  93.  
  94. // void g_array_sort(GArray *array, GCompareFunc compare_func);  
  95.     g_array_sort(array, sort);  
  96.     g_printf("All of items[sorted]:\n");  
  97.     for (i = 0; i < sizeof(m)/sizeof(m[0])-1-1-2; i++)  
  98.         g_printf("%d,", g_array_index(array, int, i));  
  99.     g_printf("\n");  
  100.  
  101. // void g_array_sort_with_data(GArray *array, GCompareDataFunc compare_func, gpointer user_data);  
  102.     g_array_sort_with_data(array, sort_r, NULL);  
  103.     g_printf("All of items[sorted reversed]:\n");  
  104.     for (i = 0; i < sizeof(m)/sizeof(m[0])-1-1-2; i++)  
  105.         g_printf("%d,", g_array_index(array, int, i));  
  106.     g_printf("\n");  
  107.  
  108.     int x[4] = {2,3,4,5};  
  109. // GArray* g_array_append_vals(GArray *array, gconstpointer data, guint len);  
  110.     array = g_array_append_vals(array, x, 4);  
  111.     g_printf("All of items[after append all 2,3,4,5]:\n");  
  112.     for (i = 0; i < array->len; i++)  
  113.         g_printf("%d,", g_array_index(array, int, i));  
  114.     g_printf("\n");  
  115.  
  116.     g_printf("All of items[after prepend one by one 2,3,4,5]:\n");  
  117. // #define g_array_prepend_val(a,v)  
  118.     for (i = 0; i < 4; i++)  
  119.         g_array_prepend_val(array, x[i]);  
  120.     print(array);  
  121.  
  122.     g_printf("All of items[after prepend all 2,3,4,5]:\n");  
  123. // GArray* g_array_prepend_vals(GArray *array, gconstpointer data, guint len);  
  124.     array = g_array_prepend_vals(array, x, 4);  
  125.     print(array);  
  126.  
  127.     int t = 0;  
  128. // #define g_array_insert_val(a, i, v)  
  129.     g_array_insert_val(array, 0, t);  
  130.     g_printf("All of items[after insert 0 at the first index]:\n");  
  131.     print(array);  
  132.  
  133.     g_array_sort(array, sort);  
  134.     g_printf("All of items[sorted]:\n");  
  135.     print(array);  
  136.  
  137. // gchar* g_array_free(GArray *array, gboolean free_segment);  
  138.     g_array_free(array, TRUE);  
  139. }  
  140.  
  141. int 
  142. main(void)  
  143. {  
  144.     printf("BEGIN:\n************************************************************\n");  
  145.     test_array();  
  146.     printf("\n************************************************************\nDONE\n");  
  147.  
  148.     return 0;  
5:结果
  
  
  
  
  1. BEGIN:  
  2. ************************************************************  
  3. There should be '10' items now. Result: 10.  
  4. All of items:  
  5. 1,2,3,4,5,6,7,8,9,10,  
  6. All of items[exclude the second item]:  
  7. 1,3,4,5,6,7,8,9,10,  
  8. All of items[exclude the second item]:  
  9. 1,10,4,5,6,7,8,9,  
  10. All of items[after remove 2 items from the third item]:  
  11. 1,10,6,7,8,9,  
  12. All of items[sorted]:  
  13. 1,6,7,8,9,10,  
  14. All of items[sorted reversed]:  
  15. 10,9,8,7,6,1,  
  16. All of items[after append all 2,3,4,5]:  
  17. 10,9,8,7,6,1,2,3,4,5,  
  18. All of items[after prepend one by one 2,3,4,5]:  
  19. 5,4,3,2,10,9,8,7,6,1,2,3,4,5,  
  20. All of items[after prepend all 2,3,4,5]:  
  21. 2,3,4,5,5,4,3,2,10,9,8,7,6,1,2,3,4,5,  
  22. All of items[after insert 0 at the first index]:  
  23. 0,2,3,4,5,5,4,3,2,10,9,8,7,6,1,2,3,4,5,  
  24. All of items[sorted]:  
  25. 0,1,2,2,2,3,3,3,4,4,4,5,5,5,6,7,8,9,10,  
  26.  
  27. ************************************************************  
  28. DONE 

 

你可能感兴趣的:(职场,动态数组,休闲,glib,GArray)