免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
11 [报告]
发表于 2009-04-10 10:43 |只看该作者
我没学过c++ 我理解的泛型就是一种通用的数据结构 我在一本书(Mastering Algorithms with C)上看到一种实现方法
typedef struct ListElmt_ {
    void               *data;
    struct ListElmt_   *next;
} ListElmt;
typedef struct List_ {
    int                size;
    int                (*match)(const void *key1, const void *key2);
    void               (*destroy)(void *data);
    ListElmt           *head;
    ListElmt           *tail;
} List;
这种方法的关键是保存数据的内存是由用户来管理的 而数据结构本身管理的内存是只用要维持这个数据结构 当然这种方法和楼主浩瀚的stl相比不值一提 (lighttpd 的 splay tree 好像就是这样的)

现在有几个很菜的问题想请教下
楼主这种我没具体用过 我不知道应该用这个stl保存值还是保存指针
如果是保存值 那一个大型的结构体传进去就难免有一次内存copy 这个从性能上看有点划不来
如果是保存指针 那删除的时候应该怎么处理 ?  这时好像很容易内存泄漏

还有数据结构里面的元素是怎么比较大小关系的呢?

接下来我会好好研究楼主的stl 免得以后老是离不开造轮子

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

回复 #2 cugb_cat 的帖子

algo_sort()这样的算法都是通过迭代器iterator_t来实现对具体数据的操作,不是通过不同的宏或函数单独处理各个容器类型,你可以看一看algo_sort()的代码。

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

回复 #7 converse 的帖子

谢谢回复,
你自己定义针对自定义类型的比较函数举一个test/test_algo.c中的例子
struct abc_t
{
    int n_value;
    long l_value;
    double d_key;
};

static void _abcgreat(const void* cpv_first, const void* cpv_second, void* pv_output);

/* test function body */
{
        deque_t t_q = create_deque(struct abc_t);
        struct abc_t t_abc;

        deque_init(&t_q);
        t_abc.n_value = 70;
        t_abc.l_value = 934000;
        t_abc.d_key = 0.24;
        deque_push_back(&t_q, t_abc);
        t_abc.n_value = 100;
        t_abc.l_value = 3000;
        t_abc.d_key = 2.09;
        deque_push_back(&t_q, t_abc);
        t_abc.n_value = 2;
        t_abc.l_value = -18;
        t_abc.d_key = 110.00;
        deque_push_back(&t_q, t_abc);
        t_abc.n_value = -902;
        t_abc.l_value = 88000;
        t_abc.d_key = -10.007;
        deque_push_back(&t_q, t_abc);

        algo_for_each(deque_begin(&t_q), deque_end(&t_q), _print_abc);
        algo_sort_if(deque_begin(&t_q), deque_end(&t_q), _abcgreat);
        printf("\n");
        algo_for_each(deque_begin(&t_q), deque_end(&t_q), _print_abc);

        deque_destroy(&t_q);
}

static void _abcgreat(const void* cpv_first, const void* cpv_second, void* pv_output)
{
    if(((struct abc_t*)cpv_first)->d_key > ((struct abc_t*)cpv_second)->d_key)
    {
        *(bool_t*)pv_output = true;
    }
    else
    {
        *(bool_t*)pv_output = false;
    }
}

论坛徽章:
0
14 [报告]
发表于 2009-04-10 12:42 |只看该作者

回复 #8 cugb_cat 的帖子

我已经做了最大的努力了
学识不够才疏学浅

论坛徽章:
0
15 [报告]
发表于 2009-04-10 12:44 |只看该作者

回复 #10 到处流浪的猫 的帖子

我以前都在csdn上(虽然也没发过多少帖子和文章),由于csdn的blog不能上传非图片类型的文件
并且csdn的blog服务也不太好。

论坛徽章:
0
16 [报告]
发表于 2009-04-10 12:48 |只看该作者

回复 #11 vbs100 的帖子

CSTL是保存数据的拷贝,STL也是保存数据的拷贝。

“还有数据结构里面的元素是怎么比较大小关系的呢?”
你可以通过自定义比较函数的方法在使用算法的时候调用自己定义的比较函数,
具体的请参看用户手册cstl.pdf和cstl_reference.pdf
谢谢,我会在cstl-1.1中加入更好的对自定义类型的支持。

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

感谢大家回帖

rt
感谢大家回帖,我把这个项目贴到我的blog中了activesys.cublog.cn

论坛徽章:
0
18 [报告]
发表于 2009-04-10 13:10 |只看该作者
昨天粗粗看了一下,比以前任何一个看到的类似stl的C版本都好,
看得出楼主也花了很多的功夫。
个人非常喜欢!
cstl的lincense怎么定的啊?

论坛徽章:
0
19 [报告]
发表于 2009-04-10 13:42 |只看该作者
简单看料下,功能很强大呵!
弱问一句 ,楼主共花了多长时间搞这么个大东东,
有什么体会和感慨没,
和c++ stl相比 ,它的 “不足” 在哪呢?

论坛徽章:
0
20 [报告]
发表于 2009-04-10 13:42 |只看该作者
原帖由 tm_wb 于 2009-4-10 12:42 发表
我已经做了最大的努力了
学识不够才疏学浅

已经做的很好了,呵呵。
互相学习吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP