Chinaunix首页 | 论坛 | 博客
  • 博客访问: 139206
  • 博文数量: 16
  • 博客积分: 770
  • 博客等级: 上士
  • 技术积分: 212
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-31 12:25
文章分类
文章存档

2011年(1)

2010年(10)

2009年(5)

分类: LINUX

2010-07-05 20:15:17

2008年11月份,为了不在使用C语言编程中一遍又一遍的实现链表,排序算法等等等等,我开始尝试编写通用数据结构和常用的算法,STL是一个好 的参照,它的接口和实现很实用,我决定参照它使用C语言编写一个库。

    最开始我把这个库命名为cstl,经历了半年的开发,我完成了1.0版本。我将它发到了CU上,大家觉得还可以,同时有人鼓励我将它开源,我想也是,可以 与别人分享与别人合作,于是我就在google code上开了一个开源项目,改名为libcstl。

    虽然libcstl 1.0开发了半年,但是1.0还是不完善,对于自定义的类型支持不够完善,此外还有很多别的缺陷。于是开始了2.0的开发,2.0很大程度上改变了1.0 的使用方式,并且引进了很多新功能,也支持windows了。

    很感谢支持libcstl的朋友们,同时希望大家多多支持。libcstl开源项目地址:

  1. libcstl是使用ANSI C编写的通用的数据结构和常用算法的库, 它模仿STL的接口形式, 包括序列容器,关联容器,容器适配器,迭代器,函数,算法等.libcstl为C编程中的数据管理提供了方便易用的程序库。
  2. libcstl 分为容器,迭代器,函数和算法四部分,此外2.0版本还添加了类型机制,这是一种为用户提供了方便使用自定义类型的机制。
  3. 容器一种用 于保存数据的类型,按照功能分为序列容器,关联容器和容器适配器。序列容器是按照数据插入的顺序保存数据,关联容器中保存的数据是根据某种规则排序的,容 器适配器是在容器的基础上对容器进行封装从而实现特定的功能,容器适配器不支持迭代器操作,因此适配器也不能够用于算法操作。
  4. 迭代器 表现的是一种指针的语义,它是对位置操作的一种类型,但是迭代器是通用的,通过迭代器可以实现对任何容器的位置操作,同时它也是容器和算法的桥梁,算法通 过迭代器对容器中的数据进行操作。
  5. 算法是通用的,它通过迭代器来操作数据区间中的数据,这样就可以对任何符合要求的容器以及数据区间 应用算法。正式因为通用的关系,相同功能的算法和容器本身的操作函数,后者更高效。
  6. 函数以及谓词是规范算法行为的,可以使用特定的函 数或者算法来改变算法的行为,带有if后缀的算法都要求使用函数或者谓词。
  7. 字符串是一种特殊的容器,它只保存字符类型,同时也支持许 多针对字符串特有的操作。
  8. 类型机制是2.0添加的新功能,它为用户使用自定义类型提供了便利,可以让用户像使用基本类型一样使用自定 义类型。

可以使你了解更多。

libcstl 2.0与1.0相比有了很大的改进,下面列出了不同点:

类 型和功能 1.0 2.0 说 明
deque_t 支持 支持
list_t 支持 支持
vector_t 支持 支持
slist_t 支持 支持
set_t 支持 支持
multiset_t 支持 支持
map_t 支持 支持 更新了默认的数据 比较规 则。
multimap_t 支持 支持 更新了默认的数据 比较规则。
hash_set_t 支持 支持 更新了默认的哈希 函数。
hash_multiset_t 支持 支持 更新了默认的哈希 函数。
hash_map_t 支持 支持 更新的默认的哈希 函数和默 认的数据比较规则。
hash_multimap_t 支持 支持 更新的默认的哈希 函数和默认的数据比较规则。
priority_queue_t 支持 支持
queue_t 支持 支持
stack_t 支持 支持
多种 iterator_t 支持 支持
range_t
支持 一种表示数据范围 的类型。
数值算法 支持 支持
通用算法 支持 支持
针对基本类型的函 数 支持 支持
针对 libcstl内部 类型的函数
支持 增加了针对容器以 及工具类型的函数和谓词。
string_t 支持 支持
pair_t 支持 支持 更新了默认的数据 比较规 则。
bool_t 支持 支持
支持c style字符串
支持 增加了对于c style字符串类型的支持。
支持用 户自定义类型 部分支持 支持 通过类型注册机制 完善了对用户自定义类型的支持。
类型注册
支持 增加了类型注册和 类型复制功能。
支持Linux 支持 支持
支持 Windows
支持 添加了 VS2005和 VS2008的编译工程。
阅读(3852) | 评论(9) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2011-03-07 10:25:28

我是 libcstl 的支持者,在使用过程中发现点问题,不知道是有意这么做的还是属于她本身的缺陷。关于 string_append_subcstr 函数,当我的字符串中包含 '\0' 时,如字符串 "hello\0, world",我即使给它指定长度 13 也无法满足需求,'\0' 后的数据都会被截断,像 c++ 中的 stl 里可以使用 buffer += string("hello\0, world", 13) 实现,这种应用对于串口解析非常有用,不知道是我使用的函数不当还是什么问题,希望引起 wb 大人关注。

chinaunix网友2011-03-03 16:13:13

string_append_subcstr 有问题,遇到 '\0' 的就中止了,不管我 len 有多长。

chinaunix网友2011-03-03 16:11:38

string_append_subcstr 有问题,遇到 '\0' 的就中止了,不管我 len 有多长。

chinaunix网友2010-11-19 23:24:40

又试了一下,总结一下VC2008下编译,会遇到的两个问题和解决办法 1. 提示不能找到'cstl/xxx.h'文件 解决方法 1) 把Additional Include Directories的内容由..\..\include,改为..\.. 2) 再用文本编辑器打开libcstl.vcproj,全局替换..\..\include\为..\..\cstl\ 2. 提示缺少va_copy() 解决方法:在cstl_types.h的第32行,加上如下代码: #ifdef _MSC_VER #define va_copy(dst, src) ((dst) = (src)) #endif 参考:http://stackoverflow.com/questions/558223/vacopy-porting-to-visual-c http://kerneltrap.org/mailarchive/git/2009/8/17/9549/thread OK,在VC2008下可以正常编译运行了。

chinaunix网友2010-11-19 22:55:29

另外,在VC2008下,Additional Include Directories的内容也不应该是..\..\include,而应是..\..