`
oldrev
  • 浏览: 233784 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

Dotmars 实例之:容器、迭代器与算法框架

阅读更多

Dotmars 实例之:容器、迭代器与算法框架

这几天 Mr. Bright 老是不放新版本,圈子里太冷清了,我来发篇程序凑个数。

这是一个类似 C++ STL 的容器、迭代器和算法框架,迭代器的设计参考了 C++ boost 库中的"new-style" 迭代器,把迭代器的遍历和读写操作分开,内置数组处理参考了 qiezi 的文章: 仿STL的vector,写了一组array操作方法。容器方法的命令没有遵循 STL 的风格,而是采用 .Net 范型容器的名称。

借助于 D 威力强大的模板和模板混入,代码虽然大量用到了模板,但是十分地简短易读。

目前仅仅实现的部分包括:
  • 双向列表容器
  • find & copy 算法(没有模板特化的优化)
  • 内置一维数组的迭代器
  • 一个AOP模式的容器操作符重载
废话少说,看看范例程序展现的威力:

D 代码
  1. module samples.base.collections;
  2. import dotmars.base.iterator;
  3. import dotmars.base.collection.list;
  4. import dotmars.base.collection.array;
  5. import dotmars.base.algorithms;
  6. import dotmars.io.console;
  7. void main()
  8. {
  9. alias List!(int) MyList;
  10. auto list = new MyList;
  11. list ~= 1; // this is equal to list.addList(1);
  12. list ~= 2;
  13. list ~= 3;
  14. list ~= 4;
  15. list ~= 5;
  16. list ~= 6;
  17. list.addFirst(7);
  18. //现在序列为: 7,1,2,3,4,5,6
  19. MyList.Iterator it = list.begin();
  20. ++it;
  21. ++it;
  22. //删除2, it 指向3
  23. it = list.remove(it);
  24. //现在序列为: 7,2,3,4,5,6
  25. list.addBefore(it, 2); //在3之前插入2,it 指向 3
  26. int[] array;
  27. array.addLast(8); //内置数组也能享受到同样的 addLast 成员函数
  28. array.addLast(9);
  29. // 内置数组也可以用迭代器访问
  30. list.addRangeBefore(it, array.begin(), array.end()); //在3之前插入array的内容,即 8,9
  31. //使用 foreach 语句遍历 list
  32. foreach(int i; list)
  33. Console.print("{0}, ", i);
  34. Console.newLine();
  35. //与 STL 类似,通过内部的迭代器反向遍历 list
  36. for(MyList.ReverseIterator ri = list.rbegin(); ri != list.rend(); ++ri)
  37. Console.print("{0}, ", ri.current);
  38. Console.newLine();
  39. //调用通用算法
  40. MyList.Iterator pos = find(list.begin(), list.end(), 5);
  41. if(pos != list.end())
  42. Console.printLine("Pattern found: {0}", pos.current);
  43. list.clear();
  44. }

运行结果:
  1. 7, 1, 2, 9, 8, 3, 4, 5, 6,
  2. 6, 5, 4, 3, 8, 9, 2, 1, 7,
  3. 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语言的特性来实现核心库比较现实.
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

其实我是这样想的,既然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
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,正好借你的源码来学习了。

相关推荐

    虚拟现实和增强现实之场景理解算法:实例分割:实例分割算法的性能评估与优化.docx

    虚拟现实和增强现实之场景理解算法:实例分割:实例分割算法的性能评估与优化.docx

    完全手册Excel_VBA典型实例大全:通过368个例子掌握 高清PDF分卷1

    完全手册Excel_VBA典型实例大全:通过368个例子掌握 高清PDF分卷1 为方便读者学习,《完全手册Excel VBA典型实例大全:通过368个例子掌握》附有光盘,光盘中包含了书中的实例文件。《完全手册Excel VBA典型实例大全:...

    迭代器模式Demo

    迭代器模式是一种设计模式,它在软件工程中扮演着重要的角色,特别是在处理集合或容器类对象的遍历操作时。这种模式提供了一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。在Java、C#等面向对象语言中,...

    很实用!!!matlab实用程序100例

    实例45:简单运算器 39 实例46:曲线色彩的修改 40 实例47:曲线标记 42 实例48:修改曲型 43 实例49:指定坐标轴范围 45 用户界面 46 实例50:绘制不同函数曲线的用户界面 46 实例51:可设置函数曲线图视角的用户...

    bp神经网络实例:贝叶斯、梯度下降算法

    ### bp神经网络实例:贝叶斯、梯度下降算法 #### 动量梯度下降算法训练BP网络 在机器学习领域,尤其是神经网络的训练过程中,梯度下降法是一种非常重要的优化算法。动量梯度下降算法作为一种改进的梯度下降方法,...

    设计模式之迭代器模式

    通常,这个接口会有一个`createIterator()`方法,返回一个与该聚合对象兼容的迭代器实例。 在`IteratorPatternDemo`示例中,我们可能会看到以下关键代码结构: ```java // 聚合对象接口 interface Aggregate { ...

    Android设计模式之--迭代器模式

    3. **迭代器模式与Android框架的结合**:在Android框架中,诸如Adapter(如ListView的Adapter)也利用了迭代器的思想,通过`getCount()`和`getItem()`等方法来遍历数据集。 4. **异常处理**:在实际使用中,要注意...

    数值迭代算法及其Matlab实例

    数值迭代算法是解决数学方程组或非线性问题的一种常用方法,特别是在计算机科学和工程领域。这种方法通过一系列近似步骤逐步逼近问题的精确解。在本教程中,我们将深入探讨数值迭代的基本概念,以及如何在强大的编程...

    Java迭代器模式:遍历集合的优雅之舞

    - **解耦**:迭代器模式将访问逻辑与容器实现分离开来,使得容器的改变不会影响到使用它的客户端代码,提高了系统的可维护性和灵活性。 - **扩展性**:可以为不同类型的容器提供不同的迭代器实现,从而方便地添加新...

    C++STL实验报告-迭代器和非变异算法

    在本篇"C++ STL实验报告-迭代器和非变异算法"中,我们将深入探讨C++标准模板库(STL)中的几个核心概念,包括容器、迭代器和非变异算法。实验的目标是熟悉set、multiset、map和multimap这四种关联容器的使用,以及...

    cpp-EASTL这是容器算法和迭代器的一个C模板库

    迭代器的设计使得EASTL容器与STL的兼容性得以保持,允许开发者利用已有的STL代码。 在`electronicarts-EASTL-3e3c282`这个压缩包中,你将找到EASTL库的源代码,包括头文件和可能的实现文件。通过阅读和研究这些源...

    一个小小例子让你读懂迭代器模式,

    迭代器模式允许你遍历任何聚合对象,无论它的内部结构如何,这使得代码更加通用,降低了客户端代码对具体容器的依赖。 在Java、C#等面向对象语言中,迭代器模式被广泛应用于集合类,如ArrayList、LinkedList等。...

    深入浅出学习Java设计模式之迭代器模式[参考].pdf

    具体迭代器角色,例如ArrayList的`Itr`类,是作为容器的内部类实现的,这样既能保持容器的封装性,又方便实现遍历算法。`AbstractList`抽象类提供了创建迭代器的工厂方法,这样每个具体的容器类(如ArrayList、...

    有效使用Iterator

    - 迭代器与特定的容器实例相关联,不能跨容器使用。 - 不同类型的迭代器(例如,`iterator`与`const_iterator`)不能直接相互转换,但可以通过显式类型转换操作(如`static_cast`)实现,但这通常不推荐,因为可能...

    Headfirst(九)迭代器模式

    聚合对象可以是一个容器,如数组、链表或者更复杂的结构,而迭代器则是一个对象,可以用来遍历这些容器中的元素。C++标准库中,`std::vector`、`std::list`等容器都提供了迭代器支持。 UML类图在这个过程中扮演了...

    迭代器模式简介和java代码实现

    在Java中,迭代器模式通常与集合框架紧密相连。如上述代码所示,我们定义了一个名为`MyCollection`的集合类,它包含一个内部类`ConcreteIterator`,实现了`Iterator`接口。`Iterator`接口有两个核心方法:`hasNext()...

    倒数的迭代算法

    通过理论分析与方案探讨,本文为倒数迭代算法提供了一个全面的理解框架。通过合理选择初始近似值、优化硬件结构以及采用有效的误差控制策略,可以显著提高算法的效率和精度。这对于设计高效且成本效益高的除法硬件...

    第二十讲:迭代模式

    描述中的链接指向了一个ITeye博客文章,虽然具体内容未给出,但可以推断这篇文章可能详细解释了迭代模式的原理,通过实例展示了如何在代码中使用迭代器模式,并可能讨论了一些最佳实践和注意事项。 标签“源码 工具...

Global site tag (gtag.js) - Google Analytics