- 浏览: 229898 次
- 性别:
- 来自: 昆明
文章分类
最新评论
-
beiyangshuishi:
确实挺幽默的,太能恶搞了。不过这也让我想起日本的一则广告宣纸的 ...
一对活宝—— MySQL & PostgreSQL -
ShiningRay:
稍微看了vcf的api,比wxwidgets要干净得多
VCF 库的搞笑提示 -
Colorful:
Wow, this is amazing.
D语言 struct constrcutor 的 bug -
oldrev:
楼下,当时的 TRAC 确实说是要 py 2.4 的
出色的开源项目管理软件——Redmine -
jusdao:
...Trac可以用python2.5啊,没有说必须用2.4的 ...
出色的开源项目管理软件——Redmine
Dotmars 实例之:容器、迭代器与算法框架
这几天 Mr. Bright 老是不放新版本,圈子里太冷清了,我来发篇程序凑个数。这是一个类似 C++ STL 的容器、迭代器和算法框架,迭代器的设计参考了 C++ boost 库中的"new-style" 迭代器,把迭代器的遍历和读写操作分开,内置数组处理参考了 qiezi 的文章: 仿STL的vector,写了一组array操作方法。容器方法的命令没有遵循 STL 的风格,而是采用 .Net 范型容器的名称。
借助于 D 威力强大的模板和模板混入,代码虽然大量用到了模板,但是十分地简短易读。
目前仅仅实现的部分包括:
- 双向列表容器
- find & copy 算法(没有模板特化的优化)
- 内置一维数组的迭代器
- 一个AOP模式的容器操作符重载
D 代码
- module samples.base.collections;
- import dotmars.base.iterator;
- import dotmars.base.collection.list;
- import dotmars.base.collection.array;
- import dotmars.base.algorithms;
- import dotmars.io.console;
- void main()
- {
- alias List!(int) MyList;
- auto list = new MyList;
- list ~= 1; // this is equal to list.addList(1);
- list ~= 2;
- list ~= 3;
- list ~= 4;
- list ~= 5;
- list ~= 6;
- list.addFirst(7);
- //现在序列为: 7,1,2,3,4,5,6
- MyList.Iterator it = list.begin();
- ++it;
- ++it;
- //删除2, it 指向3
- it = list.remove(it);
- //现在序列为: 7,2,3,4,5,6
- list.addBefore(it, 2); //在3之前插入2,it 指向 3
- int[] array;
- array.addLast(8); //内置数组也能享受到同样的 addLast 成员函数
- array.addLast(9);
- // 内置数组也可以用迭代器访问
- list.addRangeBefore(it, array.begin(), array.end()); //在3之前插入array的内容,即 8,9
- //使用 foreach 语句遍历 list
- foreach(int i; list)
- Console.print("{0}, ", i);
- Console.newLine();
- //与 STL 类似,通过内部的迭代器反向遍历 list
- for(MyList.ReverseIterator ri = list.rbegin(); ri != list.rend(); ++ri)
- Console.print("{0}, ", ri.current);
- Console.newLine();
- //调用通用算法
- MyList.Iterator pos = find(list.begin(), list.end(), 5);
- if(pos != list.end())
- Console.printLine("Pattern found: {0}", pos.current);
- list.clear();
- }
运行结果:
- 7, 1, 2, 9, 8, 3, 4, 5, 6,
- 6, 5, 4, 3, 8, 9, 2, 1, 7,
- Pattern found: 5
最新版程序可在 dotmars.googlecode.com/svn/trunk/samples/base/collections.d 处下载。
编译与执行参考这里:http://oldrev.iteye.com/blog/86634
评论
9 楼
oldrev
2007-08-07
那个单元测试框架已经移植到了1.0,不过用起来没2.0那么方便
8 楼
Colorful
2007-08-07
在我看来,大概有1/3左右的.NET Framework API无法实现,或者很难实现.
.NET解决了Windows DNA体系的所有重大问题.比如Dll hell,分布式计算等.
D仍然是基于Windows DNA体系的.比如要实现Application Domain,基于VM的GC和Native的GC等,都有相当多的问题.
还是以.NET的设计原则,考虑D语言的特性来实现核心库比较现实.
.NET解决了Windows DNA体系的所有重大问题.比如Dll hell,分布式计算等.
D仍然是基于Windows DNA体系的.比如要实现Application Domain,基于VM的GC和Native的GC等,都有相当多的问题.
还是以.NET的设计原则,考虑D语言的特性来实现核心库比较现实.
7 楼
oldrev
2007-08-07
引用
其实我是这样想的,既然Dotmars是D的C#语法化为什么不多借鉴一些C#的优点呢?比如Delegate在C#中就是一个对象,一个特殊的对象
Dotmars 只是一个类库而已,并没有涉及到语法。D也不可能完全学C#,比如 D 的编译时特性包括模板、CTFE、静态反射等都是C#没有滴,为了效率和方便性不可能放弃使用这些特性而完全 clone .net fx。
我想大概原则就是适合OO的地方就OO,适合范型的地方就范型。
6 楼
niijyeni
2007-08-07
引用
to 楼上:
链表是不能直接访问元素的,必须通过迭代器遍历
MyList.Iterator pos = find(list.begin(), list.end(), 5);
list.remove(pos); //注意当容器变化后迭代器 pos 就无效了
对于链表来说,这种操作是很低效的,需要快速的查找和删除可以使用散列表或红黑树实现的 set
链表是不能直接访问元素的,必须通过迭代器遍历
MyList.Iterator pos = find(list.begin(), list.end(), 5);
list.remove(pos); //注意当容器变化后迭代器 pos 就无效了
对于链表来说,这种操作是很低效的,需要快速的查找和删除可以使用散列表或红黑树实现的 set
其实我是这样想的,既然Dotmars是D的C#语法化为什么不多借鉴一些C#的优点呢?比如Delegate在C#中就是一个对象,一个特殊的对象
5 楼
oldrev
2007-08-04
本来就在SVN里
4 楼
xgene
2007-08-04
你的这些例子为什么不妨在svn中呢,这样方便取出!!!
3 楼
oldrev
2007-08-04
to 楼上:
链表是不能直接访问元素的,必须通过迭代器遍历
MyList.Iterator pos = find(list.begin(), list.end(), 5);
list.remove(pos); //注意当容器变化后迭代器 pos 就无效了
对于链表来说,这种操作是很低效的,需要快速的查找和删除可以使用散列表或红黑树实现的 set
链表是不能直接访问元素的,必须通过迭代器遍历
MyList.Iterator pos = find(list.begin(), list.end(), 5);
list.remove(pos); //注意当容器变化后迭代器 pos 就无效了
对于链表来说,这种操作是很低效的,需要快速的查找和删除可以使用散列表或红黑树实现的 set
2 楼
niijyeni
2007-08-04
引用
# list ~= 1; // this is equal to list.addList(1);
如果我想从这个链表中删除 1 怎么作呢??
list -= 1;??
1 楼
shawind
2007-08-04
D圈子的活力也不能总是靠DMD的新版本来支持。最近在看STL,正好借你的源码来学习了。
发表评论
-
Tango 0.99.7 Dominik 今天放出
2008-07-25 12:16 1372详细的发布公告: http://www.dsource.org ... -
D新闻组里的天才代码
2008-03-30 21:26 3261超猛的代码,刚才逛新闻组刚看到的,随便记录一下。 出自: ... -
Ubuntu & D
2008-03-23 12:33 2381前几天 Ubuntu Linux 8.04 (Hardy) 刚 ... -
Dotmars.test 单元测试框架简介
2007-11-19 22:43 94D语言内置的 unittest关键字+assert 组成的单元 ... -
mixin 模拟多继承
2007-11-10 17:40 3652D1.0 代码 /** TupleMixin ... -
简单的 C to D 转换 Ruby 脚本
2007-10-24 22:06 4589今天晚上费了点脑筋写了一个简单的 C2D 转换脚本,大致实现了 ... -
D1.0代码模拟 __traits(hasMember, ...)
2007-10-08 23:12 5106通过1.0的代码完全模拟了 D 2.0 __traits(ha ... -
更好的C++——给C++使用者的D语言简介
2007-09-14 01:30 12211作为 C++ 狂热的粉丝, ... -
让D代码自己编译自己
2007-09-12 22:55 4750刚在 D语言的新闻组里看到了D模板&元编程顶尖高人 ... -
基于 D 2.0 编译时反射的单元测试框架
2007-07-27 21:25 2791一个模仿 Ruby Test::Unit 的 Quick &a ... -
D 2.0 Const/Final/Invariant 概念简介
2007-07-24 22:55 5419D 2.0 Const/Final/Invariant 概 ... -
DotMars 版 Hello World
2007-06-05 02:17 8182DotMars 已经具有初步的样子了,特别发帖庆祝。 Dot ... -
关联数组字面值+函数字面值=支持任意类型的 switch
2007-05-19 23:29 4506刚才写字符串格式化的由于要处理所有内置类型,而且只有 Type ... -
.Net/Java 风格格式化字符串
2007-05-18 22:51 3580基础类库的东西看起来容易做起来难,今天花时间实现了一点点 . ... -
修改版 juno.com.base
2007-04-20 00:28 4276dsource 上的 juno 是一个很不错的 Windows ... -
C#-like 的 DLL 封装
2007-04-16 23:19 4366一个类似 C# 的 DllImport 实现,用于“半”动态加 ... -
简单的D语言 VIM 缩写插件
2007-04-13 15:45 3442昨晚我写了一个非常简单的 VIM 的D语言缩写插件,希望能让用 ... -
双向链表模板类
2007-04-07 02:03 3017参考 STL 实现的 Quick & Dirty 双向 ... -
用Rant自动化D语言程序构建
2007-03-31 13:54 3186上回说到 Rank 这个 Ruby 世界最广泛使用的构建工具在 ... -
D语言通用 Rakefile
2007-03-31 00:21 2903在一个日文网站上发现的通用 Rakefile for GDCr ...
相关推荐
迭代器概述: ...实例:基于list列表创建迭代器,使用next()依次获取list列表的前两个元素,并输出结果。 具体实现: list = [1,2,3,4] it = iter(list) # 创建迭代器对象 print(next(it)) print(next(it))
实例45:简单运算器 实例46:曲线色彩的修改 实例47:曲线标记 实例48:修改曲型 实例49:指定坐标轴范围 实例50:绘制不同函数曲线的用户界面 实例51:可设置函数曲线图视角的用户界面 实例52:可设置函数...
实例45:简单运算器 39 实例46:曲线色彩的修改 40 实例47:曲线标记 42 实例48:修改曲型 43 实例49:指定坐标轴范围 45 用户界面 46 实例50:绘制不同函数曲线的用户界面 46 实例51:可设置函数曲线图视角的用户...
STL是高效的C++程序库,是大量类模板和函数...2、如何实现一个与之相匹配的迭代器myliterator,该迭代器能像vector的迭代器一样,可以用它来遍历或操作访问myVector中的对象。 本套代码包含代码实现部分和测试部分。
C语言实例编程:用牛顿迭代法求一元多次方程
4、迭代器 4 5、使用注意 4 一、stack 堆栈 5 成员函数: 5 实例程序: 5 二、queue 队列 6 成员函数: 6 实例程序: 6 三、Priority Queues 优先队列 7 成员函数: 7 实例程序: 7 四、Bitset位集合 9 成员函数: 9...
迭代最近点算法综述 ICP iterative closest points 里面有五六篇关于迭代最近点算法的详细解释和实例,希望对你有用。
实例50:绘制不同函数曲线的用户界面 实例51:修改函数曲线图颜色的用户界面 实例52:可设置函数曲线图视角的用户界面 实例53:可设置函数曲线光源的用户界面 实例54:添加效果 实例55:查询日期 实例56:图形效果...
该程序是我写的博客“一起talk C栗子吧(第五十五回:C语言实例--图的最短路径三)”的配套程序,共享给大家使用
c++ 迭代器 文本查询实例程序 c++ 迭代器 文本查询实例程序
算法源码-数据处理:基于t-sne算法的降维可视化实例.zip
采用动量梯度下降算法训练 BP 网络 采用贝叶斯正则化算法提高 BP 网络的推广能力 采用“提前停止”方法提高 BP 网络的推广能力
完全手册Excel_VBA典型实例大全:通过368个例子掌握 高清PDF分卷1 为方便读者学习,《完全手册Excel VBA典型实例大全:通过368个例子掌握》附有光盘,光盘中包含了书中的实例文件。《完全手册Excel VBA典型实例大全:...
数值迭代算法基本原理,及其Matlab具体实现,内附一具体实例,绝对货真价实。
长江证券_0213_机器学习白皮书系列之四:机器学习流程和算法介绍及金融领域应用实例.pdf
5.7 实例76:设置框架窗口最大化时的大小和位置 5.8 实例77:保存或恢复框架窗口的状态 5.9 实例78:删除SDI框架窗口中的菜单 5.10 实例79:删除MDI框架窗口中的菜单 5.11 实例80:改变视图的背景颜色 5.12 实例81:...
freexyn编程实例视频教程系列47 Matlab与遗传算法 主要内容: 算法概念/流程/选择/交叉/变异/精英个体/迭代终止/可视化/过程显示/混合优化/非线性约束问题/整数约束优化问题 文档目录: 47.0 概述 47.1 算法概念和...
STM32单片机的PID算法实例.zipSTM32单片机的PID算法实例.zipSTM32单片机的PID算法实例.zipSTM32单片机的PID算法实例.zipSTM32单片机的PID算法实例.zipSTM32单片机的PID算法实例.zipSTM32单片机的PID算法实例.zipSTM...
迭代器模式的示例代码和文档,学习迭代器模式的参考资料。