原创作者: oldrev   阅读:2895次   评论:0条   更新时间:2011-05-26    

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
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

  • qiezi在2007-08-03创建
  • qiezi在2011-05-26更新
Global site tag (gtag.js) - Google Analytics