C语言实现类似C++的容器vector
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <assert.h>
4 #include <string.h>
5 typedef int DataType;
6 typedef struct array
7 {
8 DataType *Data;
9 int size,max_size;
10 void (*Constructor)(struct array *);//构造函数
11 void (*Input)(DataType ,struct array *);//输入数据
12 int (*get_array_size)(struct array *);//获取arr的大小
13 int (*return_index_value)(struct array *,int);//返回下标为index的值
14 void (*print)(struct array *);//打印结果
15 void (*Destructor)(struct array *);//析构函数
16 }Array;
17
18 void Init(Array *this);
19 void _print(struct array *this);
20 void _constructor(Array *this);
21 void _denstructor(Array *this);
22 void _input(DataType data,Array *this);
23 int _get_szie(Array *this);
24 int _return_index_value(Arrary *this,int index);
25
26 void Init(Array *this)
27 {
28 this->Input =_input;
29 this->print =_print;
30 this->get_array_size = _get_size;
31 this->return_index_value = _return_index_value;
32 this->Constructor =_constructor;
33 this->Destructor =_denstructor;
34 this->Constructor(this);
35 }
36
37 void _constructor(Array *this)
38 {
39 this->size=0;
40 this->max_size=10;
41 this->Data=(DataType *)malloc(this->max_size*sizeof(DataType));
42 memset(this->Data,0,10);
43 }
44
45 void _input(DataType data, Array *this)
46 {
47 int i;
48 DataType *ptr;
49
50 if(this->size >= this->max_size)
51 {
52 this->max_size +=10;
53 ptr=(DataType *)malloc(this->max_size*sizeof(DataType));
54 for(i=0;i<this->size;i++)
55 ptr[i]=this->Data[i];
56 free(this->Data);
57 this->Data=ptr;
58 }
59 this->Data[this->size]=data;
60 this->size +=1 ;
61 }
62
63 void _print(struct array *this)
64 {
65 assert(this != NULL);
66 struct array *ptr=this;
67 int i=0;
68 for(i=0;i<ptr->size;i++)
69 printf("data is %d\n",ptr->Data[i]);
70
71 return ;
72 }
73 int _get_array_size(Array *this)
74 {
75 assert(this != NULL);
76 return this->size+1;
77 }
78 int _return_index_value(Array *this,int index)
79 {
80 assert(this != NULL);
81 return (this->Data[index]);
82 }
83 void _denstructor(Array *this)
84 {
85 int i=0;
86 assert(this != NULL);
87 for(i=0;i<this->max_size;i++)
88 this->Data[i]=0;
89 free(this->Data);
90 }
91
92 int main()
93 {
94 Array MyArray;
95
96 Init(&MyArray); //使用对象前必须初始化,间接调用构造函数
97 // MyArray.Data[]={1,2,3,4,5};
98 MyArray.Input(1,&MyArray);
99 MyArray.Input(2,&MyArray);
100 MyArray.Input(3,&MyArray);
101 MyArray.Input(4,&MyArray);
102 MyArray.Input('5',&MyArray);
103 MyArray.print(&MyArray);
104 printf("the array size is :%d\n",MyArray.get_array_size(&MyAarray));
105 printf("the index value in array is:%d\n",MyArray.return_index_value(&MyArray,3));
106 MyArray.Destructor(&MyArray); //使用对象后必须显式调用析构函数
107
108 return 0;
109 }
C语言实现类似C++的容器vector的更多相关文章
- 2.2 C语言_实现数据容器vector(排序功能)
		
上一节我们说到我们己经实现了一般Vector可以做到的自动扩充,告诉随机存取,那么现在我们需要完成vector的一个排序的功能. 排序算法我们网上一百度哇~~!很常见的就有8大排序算法: 1.选择排序 ...
 - C语言如何实现继承及容器
		
继承的概念 继承是面向对象软件技术当中的一个概念,与多态.封装共为面向对象的三个基本特征.继承可以使得子类具有父类的属性和方法或者重新定义,追加属性和方法. 面向对象中的重要概念就是类,在我们熟知的编 ...
 - C++线性序列容器<vector>简单总结
		
C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...
 - [C++]STL容器Vector的内存释放
		
直接抛出两句话,说明到底应该如何释放Vector占用的内存. “vector的clear不影响capacity,你应该swap一个空的vector.” <Effective STL>中的“ ...
 - STL标准库-容器-vector
		
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. 向量容器vector是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍. 他的结构如下 一 定义 vector ...
 - C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
		
序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...
 - 从零开始写STL—容器—vector
		
从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...
 - C++进阶 STL(1) 第一天  [容器,算法,迭代器]  string容器 vector容器  deque容器
		
课程大纲 02实现基本原理 容器,算法,迭代器 教室:容器 人:元素 教室对于楼:容器 序列式容器: 容器元素在容器中的位置是由进入容器的时间和地点来决定 序列式容器 关联式容器: 教室中 按年龄排座 ...
 - C++ 顺序容器(vector,list、deque,stack,queue)
		
顺序容器的种类有:vector,list.deque 顺序容器适配器: stack //先进后出 栈 queue //先进先出 队列 priority_queue //也优先管 ...
 
随机推荐
- js扩展函数收集
			
1,checkbox序列化 2,form表单对象化 3,数组字符串化
 - Python+Request库+第三方平台实现验证码识别示例
			
1.登录时经常的出现验证码,此次结合Python+Request+第三方验证码识别平台(超级鹰识别平台) 2.首先到超级鹰平台下载对应语言的识别码封装,超级鹰平台:http://www.chaojiy ...
 - 10、Java——内部类
			
 1.类中定义类 (1)当一类中的成员,作为另外一种事物的时候,这个成员就可以定义为内部类. (2)分类:①成员内部类 ②静态内部类 ③私有内部类 ④局部内部类 ⑤匿名内部类 ⑥Lambda表达式 ...
 - Kafka之--多zookeeper,多broker之搭建
			
闲来如事,突发兴趣倒腾一下了kafka.其实类似环境搭建的博客很多,我这里算是整合一下,另外写出自己的过程与看法.完整的过程如下: 1)先准备好3台服务器.我准备的机器hostname/ip为: ka ...
 - P3203 弹飞绵羊-分块
			
P3203 弹飞绵羊-分块 观察数据范围,发现可以分块.只需要处理每个点跳出所在块后的位置和次数即可.目的是为了加速查询并降低修改复杂度. 对于修改,重构整个块内信息即可. 时间复杂度正确的一批 具体 ...
 - cookie详解(八)
			
一.什么是cookie 1.大概了解 什么是 Cookie?针对不同用户,做出不同的响应.,这就是Cookie的原理.是浏览器储存在用户的机器上的(可见免用户名登录)1. Cookie翻译过来是饼干的 ...
 - Tomcat7+ 弱口令 && 后台getshell漏洞
			
打开tomcat管理页面http://192.168.49.2:8080/manager/html,输入弱密码tomcat:tomcat,即可访问后台 先将jsp大马压缩为zip,再将zip后缀改名为 ...
 - Spring Security OAuth2 远程命令执行漏洞(CVE-2016-4977)
			
影响版本: 2.0.0-2.0.9 1.0.0-1.0.5 poc地址 https://github.com/vulhub/vulhub/blob/master/spring/CVE-2016-497 ...
 - Linux 数据库操作(一)
			
我们可以将用于数据服务的数据库分为关系型数据库和非关系型数据库,关系型数据库最典型的就是Mysql,以及和他同源的MariaDB数据库,oracle等,非关系型数据库则有redis数据库,mongod ...
 - C函数调用(2)
			
1 //函数调用 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <math.h> 6 //根据传入 ...