首页 > 其他分享 >【glibc】glib库数组GArray介绍

【glibc】glib库数组GArray介绍

时间:2024-01-22 10:45:42浏览次数:30  
标签:glib arr GArray cur int glibc len prepend array

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


/*
 * 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);
}

标签:glib,arr,GArray,cur,int,glibc,len,prepend,array
From: https://www.cnblogs.com/opensmarty/p/17979478

相关文章

  • 【glibc】glib库hash表GHashTable介绍
    hash表是一种提供key-value访问的数据结构,通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典,通过单词的首字母能够快速的找到单词。关于hash表的详细介绍请查阅数据结构的相关书籍,我这里只介绍glib库中hash表的基本用法。要使用一个hash表首先必......
  • 【glibc】glib库队列GQueue介绍
    队列是一种向最后添加条目,从最前删除条目的数据结构,这种数据结构在处理按顺序到达的数据是很有用。glib库提供的队列GQueue是一个双端队列,它的实现基础是双向链表,所以它支持在队列的两端进行添加和删除,也支持很多其它的操作,比如在队列中进行插入和删除,但是我不推荐使用这样的功能......
  • spring--CGLIB动态代理的实现原理
    CGLIB(CodeGenerationLibrary)是一个强大的、高性能、高质量的代码生成库,它可以在运行时扩展Java类和实现Java接口。CGLIB动态代理是基于继承的方式来实现的,它不需要接口,可以代理普通类。以下是CGLIB动态代理的实现原理:继承:CGLIB动态代理通过继承目标类来创建子类,并在......
  • spring--JDK动态代理和CGLIB代理的区别
    JDK动态代理和CGLIB代理是Java中常用的两种动态代理实现方式,它们各有特点和适用场景:JDK动态代理:JDK动态代理是基于接口的代理方式,它使用Java反射机制来创建代理对象,并要求目标对象实现一个或多个接口。在代理过程中,JDK动态代理会创建一个实现了目标对象所有接口的代......
  • /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found问题解决
    有一个go实现的项目代码最近有更新,自己在开发环境上手动构建并运行都没有问题(构建和运行时相同环境,肯定没有问题^_^)。后面通过jenkins构建镜像也没有问题,运行时却报错 之前的版本在jenkins上构建也是成功的,后沟通得知jenkins集群版本最近有更新 那么,大概知道原因了,由于jenk......
  • GLIBC修复笔记
    微信公众号:运维开发故事作者:wanger背景公司环境有台机器硬盘故障,需要安装megacli工具进系统查看raid信息,在ubuntu20.04安装megacli解决依赖过程中失误将高版本的libtinfo包装系统上了,导致系统报glibc对应的版本没有找到,系统实际glibc的版本是2.31。解决办法如果系统的ssh没有断开,可......
  • 解决/lib64/libc.so.6: version `GLIBC_2.14' not found(Linux环境)
    ......
  • 高版本gcc编译出的程序在低版本glibc机器上运行
    比如我们用gcc9.3.0编译程序,但需要发布的机器gcc版本是4.8.5,怎么办?你可能想到如下方法静态编译容器发布打包依赖的so,使用本地so运行程序1.静态编译将libc和libstdc++静态编译,编译时带上如下参数。g++-static-libgcc-static-libstdc++glibc并不推荐静态链接,你依赖......
  • 在idea中无法查看org.springframework.cglib.core.Signature.java 源码
    一、现象1.点击ideaDownloadSource,没有变化;ChouseSource也无济于事。2.打开下载的源码包,惊奇的发现确实没有对应的源码。3.问题发生在哪儿?原来是这些包原本不属于spring,spring在编译的时候直接修改了包名称。 ......
  • No package 'glib-2.0' found
     001、./configure命令报错如下: Nopackage'glib-2.0'found 002、查找改文件[[email protected]]#find/-name"glib-2.0.pc"##只在conda环境中存在/root/anaconda3/pkgs/glib-2.69.1-he621ea3_2/lib/pkgconfig/glib-2.0.pc/root/anaconda3/li......