Linux C语言教程:如何实现C标准库中的vector容器
在C++中,vector是一种非常常用的动态数组容器,但在C语言中并没有类似的容器。本篇文章将介绍如何在C语言中实现一个类似vector的动态数组容器,以便更方便地管理动态数组。
实现过程
1. 定义结构体
我们首先需要定义一个结构体来表示容器,其中包含三个成员变量:指向数组的指针,容器中已经存储的元素个数以及数组的容量大小。
typedef struct vector {
void** array;
size_t size;
size_t capacity;
2. 初始化容器
在创建一个新的容器时,需要先为数组分配一定的空间。为避免过多的内存分配及释放操作,我们可以一开始就为数组分配一个默认的容量大小,在数组满时再进行扩容。在这里,我们将默认容量大小设置为10个元素。在实现时,我们需要调用calloc函数来分配内存,以便初始化所有元素为NULL。
vector* new_vector() {
vector* v = malloc(sizeof(vector));
v->array = calloc(10, sizeof(void*));
v->size = 0;
v->capacity = 10;
3. 添加元素
在向容器中添加元素时,我们需要先判断当前容器中是否还有足够的空间。如果没有,则需要对数组进行扩容。在这里,我们将数组的容量扩大为原来的两倍。在实现中,我们调用realloc函数来对数组进行扩容操作。
void vector_push_back(vector* v, void* element) {
if(v->size == v->capacity) {
v->capacity *= 2;
v->array = realloc(v->array, v->capacity * sizeof(void*));
v->array[v->size++] = element;
4. 获取元素
获取容器中的元素可以通过下标来实现。需要注意的是,我们需要对下标进行合法性检查,确保下标在[0,size)的范围内。在这里,我们直接返回数组下标对应的元素。
void* vector_at(vector* v, size_t index) {
if(index = v->size) {
return NULL;
return v->array[index];
5. 销毁容器
在不再需要使用容器时,需要对容器进行销毁。在销毁之前,我们需要先释放数组的内存,然后释放容器的内存。
void vector_destroy(vector* v) {
free(v->array);
完整代码展示
typedef struct vector {
void** array;

size_t size;
size_t capacity;
vector* new_vector() {
vector* v = malloc(sizeof(vector));
v->array = calloc(10, sizeof(void*));
v->size = 0;
v->capacity = 10;
void vector_push_back(vector* v, void* element) {
if(v->size == v->capacity) {
v->capacity *= 2;
v->array = realloc(v->array, v->capacity * sizeof(void*));
v->array[v->size++] = element;
void* vector_at(vector* v, size_t index) {
if(index = v->size) {
return NULL;
return v->array[index];
void vector_destroy(vector* v) {
free(v->array);
vector* v = new_vector();
vector_push_back(v, &a);
vector_push_back(v, &b);
vector_push_back(v, &c);
printf(“%d\n”, *((int*)vector_at(v, 0)));
printf(“%d\n”, *((int*)vector_at(v, 1)));
printf(“%d\n”, *((int*)vector_at(v, 2)));
vector_destroy(v);
相关问题拓展阅读:
怎样从vector中取出数据
vector重载了操作符,所雀森以取盯岁槐出数据和数组一样凯友用;
参考方法如下:
vector name1;
while(cin>>m_gname)
name.push_back(m_gname);
for(vector::iterator iter1=name.begin();iter1!=name.end();iter1++)
socket编程
编一个程序,实现以下过程:
对于三台电脑A、B、C,A给B发一条命令,B接收到命猛巧肆令之后将命令转发给C,C接到命令并完成宽陪命令之后报告给B,B再报告给A。
另外,B也可以直接发送命令给C。
电脑之间的联系通过有线或者无线来完成,其中A和B相连,B再和C相连,但是A和C不相连,只能通过中间B来连接。
这个程序可以用VC++来编,用到枝轿一部分Scoket网络编程的知识。
linux c实现vector的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux c实现vector,「Linux C语言教程」 如何实现C标准库中的vector容器,怎样从vector中取出数据的信息别忘了在本站进行查找喔。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
VC++中STL的容器都有哪些,怎么用。
vector 线性容器deque 双端队列stack 栈(适配器)queue 队列 (适配器)set 集合multiset 可重复集合map 映射multimap 可重复映射valarray 数值数组怎么用去网上依次搜索各个容器,成员和用法都有详尽的介绍。
ArrayList,LinkedList,Set的区别是什么?
ArrayList 实现List接口 ,随着向 ArrayList 中不断添加元素,其容量也自动增长对于处理一列数据项,Java提供了两个类ArrayList和LinkedList, ArrayList的内部实现是基于内部数组Object[], 所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别。在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列 数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了Set一个不包含重复元素的容器
“composite 2011”是什么程序?
模式意在组成任意复杂度的整体--部分组件层次结构,同时将单个组件或复合组件视为统一的接口。 树形组织结构就是其中一种表现形式。 树形结构中有叶子结点和非叶子结点(根结点是特例),非叶子结点可以添加,删除(add(),delete())子结点,获取子结点(getChild()),叶子结点没有;此外树结构的所有节点还有共同的操作(operator()).用户界面通常由两种基本类型的组件构造:基本组件和容器组件,容器组件可以在其内部嵌套任意数目的组件,而基本组件则不行。 使用这两种组件类型,开发者可以建立更强大的组件,进而创建多姿多彩的用户界面。 但是在与复杂的组件层次结构打交道时,必须在容器组件和基本组件之间进行区分,比较麻烦,composite提供了一种解决方案。 适用它的情况:a. 要表现“部分-整体”的层次结构时b. 希望在事件组件层次中,同等对待复合组件与单个组件。 2. 通过下面的示例来理解示例1:基类shape 类有两个派生类Circle和Square(相当于叶子结点或者是单个组件),第三个派生类CompositeShape是个组合体(相当于非叶子结点或者是容器组件),它持有一个含有多个shape实例的列表,当调用CompositeShape中的draw()时,它就把这个方法委托给列表中的每一个实例。 对于系统而言,一个CompositeShape实例就像是一个独立的shape,可以把它传给使用shape的方法或者对象。 实际上,它只是一组shape实例的proxy.程序:Public interface Shape { Public void draw();}:[code]Public class CompositeShape implements Shape { private Vector Comshape = new Vector();public void add(Shape shape) { (shape); }Public void draw() { for( int i = 0; i < (); i ++ ) { Shape shape = (Shape) (i); (); } }}
发表评论