免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 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复制 */
-----------------------------------------------------------------------------------
取出数据我现在采用的是直接返回指定数据的指针。
-----------------------------------------------------------------------------------
删除数据正像你上面说的一样。
-----------------------------------------------------------------------------------
此为还有当复制容器时
保存值的容器可以很容易就复制了,
但是保存指针的容器复制后两个容器中的指针都是指向一块内存了,当销毁一个容器后另一个容器就无效了。
-----------------------------------------------------------------------------------
现在有事不能继续回复了
晚上再回复,抱歉。

论坛徽章:
0
12 [报告]
发表于 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 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2009-04-13 19:22 |显示全部楼层

cstl的不足

谢谢大家关注CSTL 1.0.0
CSTL还有很多不足:
1.不能使用数组初始化容器。
2.不能使用任意数据区间初始化容器。
3.对内部含有指针的类型支持的不好。
4.使用自定义类型时要求用户编写额外的二元函数来支持自定义类型的操作。

我会在1.1版中支持这些特性。

如果有什么建议或者发现bug请给我留言或发邮件。
谢谢大家支持。

论坛徽章:
0
14 [报告]
发表于 2009-04-16 19:05 |显示全部楼层

cstl的项目管理

惭愧,由于本人对开源项目管理的流程和细节还不太清除,所以cstl才有的是原始的纯手工管理,
不过我现在正在加紧了解开源项目管理的信息,学习怎样管理开源项目。将来我会建立一个个开源项目的。

论坛徽章:
0
15 [报告]
发表于 2009-04-23 20:02 |显示全部楼层

libcstl

我在googlecode上为cstl创建了一个开源项目,并改名为libcstl,地址:libcstl.googlecode.com欢迎大家访问!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP