免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2009-04-13 11:01 |只看该作者
学习!!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
32 [报告]
发表于 2009-04-13 11:28 |只看该作者
牛B, 这么短时间,还能将DOC搞得这么细,支持

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
33 [报告]
发表于 2009-04-13 11:30 |只看该作者
赶紧创建一个project ,招募更多的高手,把它搞得更完善,走出国门,销往印度

论坛徽章:
0
34 [报告]
发表于 2009-04-13 11:45 |只看该作者
原帖由 cookis 于 2009-4-13 11:30 发表
赶紧创建一个project ,招募更多的高手,把它搞得更完善,走出国门,销往印度


哥们真幽默

论坛徽章:
0
35 [报告]
发表于 2009-04-13 11:54 |只看该作者
真是强人

论坛徽章:
0
36 [报告]
发表于 2009-04-13 12:08 |只看该作者
年起来不错。。。

论坛徽章:
0
37 [报告]
发表于 2009-04-13 13:01 |只看该作者

回复 #30 vbs100 的帖子

谢谢你的建议
我说明一下使用传值意图
首先你上面用的例子比较特殊,不便于说明问题,我在举一个例子
typedef struct _tagabc
{
    int n_value;
    double d_value;
}abc_t;
这个结构体中不包含指向堆的指针。
插入数据时:
使用传值:
abc_t t_abc = {10, 10.0};
/* 执行插入操作,将t_abc复制 */
/* 第二次插入是可以使用同样一个值 */
t_abc.n_value = 20;
t_abc.d_value = 20.0;
/* 执行插入操作,将t_abc复制 */
使用传地址:
abc_t* pt_abc = (abc_t*)malloc(sizeof(abc_t));
pt_abc->n_value = 10;
pt_abc->d_value = 10.0;
/* 执行插入操作,将pt_abc复制 */
/* 第二次在插入的时候就必须在为这个指针分配内存,因为容器中只是保存了指向内存的指针,并没有复制内存,如果没有为pt_abc分配新的内存就直接修改其值,这样容器中的值也跟着改变了,这对于set_t类的容器来说是致命的错误 */
pt_abc = (abc_t*)malloc(sizeof(abc_t));
pt_abc->n_value = 20;
pt_abc->d_value = 20.0;
/* 执行插入操作,将pt_abc复制 */
这是使用自定义类型的数据,但是要是使用C内部类型那么传地址就更麻烦了。
例如使用int类型
我可以使用4, 8, 298这样的数字文字量来当作参数,传地址就必须如下操作:
int* pn_value = (int*)malloc(sizeof(int));
*pn_value = 4;
/* 执行插入操作,将pn_value复制 */
pn_value = (int*)malloc(sizeof(int));
*pn_value = 8;
/* 执行插入操作,将pn_value复制 */
-----------------------------------------------------------------------------------
取出数据我现在采用的是直接返回指定数据的指针。
-----------------------------------------------------------------------------------
删除数据正像你上面说的一样。
-----------------------------------------------------------------------------------
此为还有当复制容器时
保存值的容器可以很容易就复制了,
但是保存指针的容器复制后两个容器中的指针都是指向一块内存了,当销毁一个容器后另一个容器就无效了。
-----------------------------------------------------------------------------------
现在有事不能继续回复了
晚上再回复,抱歉。

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

回复 #37 tm_wb 的帖子

我明白你说的传值的好处了。连续插入数据的时候这点对用户来说确实方便,用户只用一个数据拷贝,不用重新申请
但是数据结构底层却隐藏了一个malloc内存,和一个内存copy
传指针的时候正如你所说的那样,连续插入数据的时候是要连续的分配内存 比如
abc_t *a;
a = malloc(sizeof(*a));
a->n_value = 1;
a->d_value = 1.0;
insert (a)

a = malloc(sizeof(*a));
a->n_value = 2;
a->d_value = 2.0;
insert (a)

这样做的好处就是少了一次内存copy,当然这样看起来很奇怪,也很麻烦

此为还有当复制容器时
保存值的容器可以很容易就复制了,
但是保存指针的容器复制后两个容器中的指针都是指向一块内存了,当销毁一个容器后另一个容器就无效了。

这个我还没写过这么复杂的数据结构。我是这样想的,复制就涉及了两个用户数据的关系,就像最重要的比较两个用户数据的前后关系,应当由用户提供函数,复制容器时调用
而且在传值的的情况下,用户定义的结构里有指针,直接复制还是会出现一个容器销毁后另一个容器就无效

[ 本帖最后由 vbs100 于 2009-4-13 14:53 编辑 ]

论坛徽章:
0
39 [报告]
发表于 2009-04-13 16:01 |只看该作者
对楼主的行为,不得不佩服。
下载后粗略看了看,各方面都挺规范的,文档也写得很不错,有时间再好好看看。看得出楼主真是下了一番苦功,是个难得做实事的人。
希望楼主再接再厉,向楼主致敬。

论坛徽章:
0
40 [报告]
发表于 2009-04-13 18:39 |只看该作者

回复 #38 vbs100 的帖子

继续中午的回复
还有另一种数据类型,
typedef struct _tagabc
{
    int* pn_value;
}abc_t;
这样的结构在cstl中支持不够好,因为pn_value指向的是堆上的内存,容器内部结构并不知道
数据具体的情况所以无法对堆上的数据进行复制,这就造成了当数据容器中的数据拷贝或删除时
内存丢失。
简单的说就是cstl没有类似于c++的深拷贝那样的功能。
这个问题我要在cstl 1.1中解决。
谢谢你的建议,我回考虑以后改版时候使用你的方法。

[ 本帖最后由 tm_wb 于 2009-4-13 18:45 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP