您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
在c语言中要用到,类似java中的ArrayList的功能,一般是怎么做的?
函数,数组,语言在c语言中要用到,类似java中的ArrayList的功能,一般是怎么做的?
发布时间:2020-12-06加入收藏来源:互联网点击:
问题补充: 如题,谢谢!
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
在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
回答于 2019-09-11 08:43:50
ArrayList的泛型功能,还是数组长度自增功能?如果是泛型,那做不了,不支持!
如果是自增长度,Java里是每add一次检查一下数组长度是否还有剩余空间可用,如果不可用了,不够长了,那就会新申请一个原来长度2倍的数组,并把原来的数组里的内容拷贝到新数组里!
回答于 2019-09-11 08:43:50
两个途径:
1、自力更生,自己造一个,list就是链表。
2、去开源项目中挖一个。大部分开源项目都有list算法。
C靠积累,写得多了就有了自己的库。
回答于 2019-09-11 08:43:50
计科专业从事嵌入式开发已经多年了,对于C语言用的比较多,java相关的项目也做过几个,在具体的项目中如果采用C语言的编写,在实现具体的应用功能的时候消耗的代码量相对比较多,而且很多像java中的集合或者队列的概念,这些基本的工具都需要自己去实现,而且一旦实现的存在问题还会导致系统的崩溃或者内存泄漏,一般来讲做过C语言做过项目,每次实现应用级开发的时候需要涉及到新的功能模块可能需要实现的代码不仅仅是业务模块的代码了。
相对来讲如果是java层面的代码,开源的类库和标准的库非常多,所以在编写业务模块代码上还快于底层的编程语言,所以从语言的性质考虑底层的编程语言还是适合在底层做支架类的事情,高级语言去做应用级别的开发,因为应用开发来讲变化比较多,涉及到的范围也比较广泛,但是高级语言本身自带的或者开源的类库多如牛毛,所以在应对用户需求的时候更加灵活自如,任何一种编程语言都有其优势点,编程语言虽然种类繁多,但是每种编程语言只是在自己适合的场景出现,这样编程的效率还会极大的增强。
早期的编程效率要比现在还是低很多,早期的编程语言的种类也比现在少,而且基本上采用底层的编程语言去开发应用,不仅仅效率低还非常容易造成系统的崩溃,现在应用开发可以选择的开发语言非常多,所以早期的底层开发语言已经慢慢在应用端没有市场了,这也是科技发展的必然趋势,分工变得越来越明细化,合适的人做合适的事情。
目前市场的状态是C/C++底层编程语言在市场绝对工作数量并不低,但是相对比例在下降,毕竟大部分的企业还是应用级别的开发为主,能够大规模的搞底层开发的企业毕竟属于有实力的企业,现在国内编程应用级别的开发主要是互联网企业,对于像java,python,php之类用的比较多,但并不是意味着像C语言之类的底层语言就不重要了,就拿现在比较火热的人工智能来讲底层框架的构建还是离不开C/C++,毕竟像复杂的算法性能的要求是比较高的,虽然高级语言也能去做但在性能上还是抵不住底层编程语言。
上一篇:有人说决定离婚的不是吵闹,而是相互逐渐陌生的态度,对此你怎么看?
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |