免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: tm_wb
打印 上一主题 下一主题

[C] cstl -- c语言编写通用数据结构和常用算法库(模仿SGI STL) [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-04-10 17:25 |只看该作者

相当的好, 高度赞扬

cstl实现得相当的好, 支持楼主继续开发, 继续扩展和浓缩, 说不定以后可以做成标准呢

论坛徽章:
0
22 [报告]
发表于 2009-04-10 18:29 |只看该作者

回复 #19 windyrobin 的帖子

从去年11月开始开发的。
和sgi stl比当然还是有很大的差距的,cstl对于自定义类型支持的还有些欠缺,尤其是自定义类型内部带有指针类型的,
我会在1.1版本中加强的。

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
23 [报告]
发表于 2009-04-10 20:22 |只看该作者

回复 #22 tm_wb 的帖子

所以要提供一个通用数据释放函数 由用户自己来定义 就像我前面例子里的destroy
全部是本地变量可以直接赋成 free 有指针的就要自己释放了 不然直接扔掉就内存泄漏了

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
24 [报告]
发表于 2009-04-10 20:34 |只看该作者

回复 #22 tm_wb 的帖子

想到一种方法解决  比如
list_t t_l = create_list(abc_t *);

直接把指针放到你的 cstl 里 这样不就解决了 ?删除的时候你再返回这个指针
这样用户数据的内存管理由用户负责 数据结构的内存管理由你来负责 不知道这样行不??

论坛徽章:
0
25 [报告]
发表于 2009-04-10 21:33 |只看该作者
高手啊。。。。。

论坛徽章:
0
26 [报告]
发表于 2009-04-11 22:10 |只看该作者
glib不好吗?

论坛徽章:
0
27 [报告]
发表于 2009-04-11 22:38 |只看该作者
原帖由 vbs100 于 2009-4-10 20:34 发表
想到一种方法解决  比如
list_t t_l = create_list(abc_t *);

直接把指针放到你的 cstl 里 这样不就解决了 ?删除的时候你再返回这个指针
这样用户数据的内存管理由用户负责 数据结构的内存管理由你来负 ...

现在cstl也可以保存指针,但是需要这样需要用户做很多额外的工作,还有就是复制数据的时候很麻烦。

论坛徽章:
0
28 [报告]
发表于 2009-04-11 22:40 |只看该作者
原帖由 Knort 于 2009-4-11 22:10 发表
glib不好吗?

最开始开发的时候只是为了学习和巩固数据结构和算法。
慢慢的写的多了就干脆做了一个库。

论坛徽章:
0
29 [报告]
发表于 2009-04-12 12:05 |只看该作者
原帖由 tm_wb 于 2009-4-11 22:40 发表

最开始开发的时候只是为了学习和巩固数据结构和算法。
慢慢的写的多了就干脆做了一个库。


在glib的基础上做扩展不是更好?不用重复造轮子,而且也更贴近实际。

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
30 [报告]
发表于 2009-04-13 00:19 |只看该作者
原帖由 tm_wb 于 2009-4-11 22:38 发表

现在cstl也可以保存指针,但是需要这样需要用户做很多额外的工作,还有就是复制数据的时候很麻烦。


传(空)指针,可以减少数据复制 用户额外做的事情也不多  我来班门弄斧一下,说说传值和传指针用户使用上的区别
我这里说的数据结构不特指 cstl 中的

首先用户定义了一个结构
typedef sturct {
int a;
void *b;
...
} abc_t;
如果用户自定义结构内有指针变量,那这个指针应该是指向heap上数据的指针,至少也应该是指向全局变量的(不建议用啊)

定义一个类型为 abc_t 的变量
传值:
abc_t abc; // abc是一个stack上的变量
传指针:
abc_t *abc = malloc(*abc); // abc是一个heap上的变量

修改这个 abc
传值:
abc.a = 10;
...
传指针:
abc->a = 10;
...

插入到一个 cstl 的数据结构里面
传值:插入函数会有一个malloc(sizeof(abc_t)在heap上申请内在用于保存用户数据 一个memcpy(,,sizeof(abc_t)  把stack上的数据复制到heap上
传指针:指针赋值

从cstl 的数据结构里面取出一个数据
传值:取出函数会有一个memcpy(,,sizeof(abc_t)  把heap上的数据复制到stack上(也可能传指针,对不起没来得及看代码)
传指针:指针赋值

修改一个 cstl 的数据结构里
传值:修改函数会有一个memcpy(,,sizeof(abc_t)  把stack上的数据复制到heap上(如果取出操作返回的是指针,这步也没有)
传指针:无(因为通过指针修改heap上的数据会立即生效)

从cstl 的数据结构里面删除一个数据
传值:这里有点麻烦,要调用用户的释放函数,不能简单的free,所以不符合内存谁申请释放的原则
传指针:把这个地址返回给用户,让用户自己释放

以上我是所能想到的传值和传指针的区别,其实也是用宏和用空指针来实现通用数据结构的区别。 所以传指针可以减少内存copy,而用户所以 做事情并没有增加,只是用户上的方法不同。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP