glib库数组GArray介绍

 glib库中的数组GArray类型很像C++标准容器库中的vector容器。要使用glib库中的数组中需要声明一个指向GArray类型的指针。GArray的定义如下:
struct GArray
{
gchar *data;
guint len;
};

然后就可以在这个数组前或者数组后添加数据,添加数据的时候数组也会像C++中的vector容器一样自动增长,
并分配内存。下面我们来看看这一段示例代码:

/*
 * file: g_array.c
 * desc: 这个文件用于演示glib库中数组GArray的用法
 * compile: gcc -o g_array g_array.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  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 ));
    
    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_free(array, TRUE);
}

用下面的命令编译程序
gcc -o g_array g_array.c `pkg-config --cflags --libs glib-2.0`
编译后生成可执行文件g_array,执行程序
$./g_array
程序执行结果如下

[plusboy@localhost c]$ ./g_array

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

下面解释一下上面这段代码

我们用函数g_array_new()创建一个数组,它有三个参数:第一个表示是否在数组的尾部添加'/0'结束符;
第二个表示当分配空间给数组元素时是否要把它初始化为‘0’;第三个表示数组里每个元素的长度。

我们用g_array_append_val()向数组中加入数据,这个函数有点像vector容器的push_back()函数,它向数组
的尾部添加数据,如果内存空间不够就自动分配内存。因为g_array_append_val()是一个使用引用的宏,
所以你不能像g_array_append_val(array, 3)这样调用,你必须先把3赋值给一个变量val,然后像
g_array_append_val(array, val)这样调用。

然后用一个display_array()函数打印数组中的元素,这个函数里用到了g_array_index()函数按索引取数组
中的元素,g_array_index()也有三个参数,第一个是要访问的数组,第二个是数组中的数据类型,第三个
是要访问的数组元素的索引。

g_array_append_vals()函数像g_array_append_val()函数一样,向数组尾部添加元素,只是g_array_append_vals()
一次可以添加多个元素。

g_array_prepend_vals()类似于g_array_append_vals(),只是添加的元素位于数组首部。

g_array_insert_val()函数向数组中指定位置插入元素,后面元素按顺序后移。

g_array_remove_index()函数删除数组中指定位置的元素,后面的元素按顺序前移。

g_array_remove_index_fast()函数删除数组中指定位置的元素,数组中的最后一个元素移到该位置,实际上
就是用最后一个元素的值赋给指定元素,然后删除除最后一个元素。所以该函数会改变数组的顺序。

最后不要忘了用g_array_free()删除数组,释放内存空间。

glib库的更多参考:
http://developer.gnome.org/doc/API/glib/index.html
http://developer.gnome.org/doc/API/2.0/glib/index.html
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值