在c语言中要用到,类似java中的ArrayList的功能,一般是怎么做的?

小桥流水97455


在c语言中要用到,类似java中的ArrayList的功能,一般是怎么做的?

1. 标准C肯定是没有的,用第三方库才能使用类似功能。

2. C++可以使用STL。

3. 可以自己实现一下C版本的ArrayList,毕竟Java对象可以转为C结构体和成员指针,ArrayList本质也只是一个数组。

(注:C语言再规定合适的约束的前提下,也是可以面向对象编程的!)


一个简单的C ArrayList的Demo实现

1. 文件结构:

ArrayList.h:头文件

ArrayList.c:实现头文件中的功能

ArrayListTest.c:测试


2.ArrayList.h

头文件的基本框架:

#ifndef _ARRAYLIST_H
#define _ARRAYLIST_H
// 头文件体
#endif

头文件中应包含结构体定义,必要的宏定义,需要直接在其他文件中使用的函数的定义。

Java中的ArrayList是实现引用的数组,而不是对象的数组,在连续的存储空间中存放的是引用,而不是对象实体,所以在实现的时候采用void**,那么这样实现的ArrayList将可以含有任意类型的变量,坏处就是需要在使用的时候人为的解析。

capacity是当前item_list申请的长度。

my_size是当前item_list中存放了多少个元素。之所以不用size是为了和接下来实现的size函数区别。

为实现通过结构体通过调用成员的方式调用函数,而不是直接通过函数名调用函数。在结构体中声明函数指针用以调用函数。这样就可以在ArrayList.c中将函数的作用域声明为只有本文件可见,避免和其他库函数函数名冲突。但是因为结构体中包含这个文件中函数的指针,仍然可以调用函数。

typedef struct ArrayList ArrayList;
struct ArrayList{
void** item_list;
int capacity;
int my_size;

// 函数指针
}

为实现函数指针的赋值,需要声明初始化函数,在初始化函数中将函数指针赋值,所以这两个函数就不能放到结构体中:

// create a new ArrayList
int init_ArrayList(ArrayList*);
// create a new ArrayList with specified capacity
int init_ArrayList_capacity(ArrayList*,int capacity);


3.ArrayList.c

包含头文件,实现函数

因为这些函数无法知道是哪个结构体调用自己的,所以都需要将调用的结构体传进去。


4.ArrayListTest.c

包含头文件

调用的方式类似:

al.retainAll(&al,aap+3,11);

al.trimToSize(&al);


由于篇幅有限,完整的实现请参照Github仓库的简易demo:C-Wheel-ArrayList


Ruby呀


ArrayList的泛型功能,还是数组长度自增功能?如果是泛型,那做不了,不支持!

如果是自增长度,Java里是每add一次检查一下数组长度是否还有剩余空间可用,如果不可用了,不够长了,那就会新申请一个原来长度2倍的数组,并把原来的数组里的内容拷贝到新数组里!


列炮缓开局


两个途径:

1、自力更生,自己造一个,list就是链表。

2、去开源项目中挖一个。大部分开源项目都有list算法。

C靠积累,写得多了就有了自己的库。


光明右使8787


不熟悉Java的功能,C#类似的知道,用C也可以仿的。這個模擬的動態數組,用C語言實現,並不難,涉及語言特性和多线程的,沒必要自找麻烦去實現完整。高效的解決方案,是直接使用C++做編譯器,寫的基本上是C代碼,到相关部分就直接使用C++標凖庫即可——兩者的本質区别是編程思想不是語法,用C++編譯器寫C程序无妨的。


TonyDeng


c语言没有这种容器,这种容器的本质是,当元素长度快达到数组的上限时(具体达到上限的多少,每种语言都有设定),就给数组扩容,申请更大容量的数组。c语言也可以封装成这样的容器,不过c语言没有类的概念,封装起来比较麻烦,一般用结构体来粗略表示类,结构体中包含一个函数(检测数组实际元素长度,若超过容量的一半,执行扩容),数组,数组容量n


分享到:


相關文章: