标签:
字符串的操作在软件开发中是特别重要的一个事情,因为基本上的编程都会使用到字符串,字符串操作的好坏决定着一个语言的好与差。在我做过的一个项目中曾经就出现过字符串操作性能问题。
D语言字符串有 string,wstring,dstring三种类型,在D语言中字符串是使用字符数组定义的,三种类型分别对应char,wchar,dchar。char只有一个字节,wchar为双字节,dchar为三字节。对字符串的操作也相当于是对数组的操作,这跟其它语言不一样,C++中字符串是以string类来进行封装,它的操作是就string类提供的函数来完成,C#中也是一样。而D中的字符更像是c语言中的字符串。
在D语言要数组是做了很大的改进,这也使得D语言的string比其它语言的string的操作在性能上表现得更好。先来个例程看看:
import std.stdio; int main(string[] argv) { auto tmp = "Hello Honan!"; int n = 8; auto sub1 = tmp[0..$]; auto sub2 = tmp[0..5]; auto sub3 = tmp[0..n]; writeln(sub1); writeln(sub2); writeln(sub3); readln(); return 0; }
运行输出
看上面程序,auto sub1 = tmp[0..$]中,$表示数组的最大长度,这句也就是取整个字符串。
这一个取子字符串的操作,这样的取字符串写法简单,而且把数组的操作直接应用到字符串操作中来,不需要另外写个subString函数来完成。在编译器层面把字符串的操作进行要处理和优化,这也可以大大提高字符串操作的性能。
有人可能就会说,除了编译器可能会做一定优化,又能提高多少性能呢?哈哈,如果你这样想不错了,来看看下面一个例子:
import std.stdio; int main(string[] argv) { auto tmp = "Hello Honan!"; auto sub2 = tmp[0..5]; (cast(char[])(sub2))[3] = ‘K‘; writeln(tmp); writeln(sub2); readln(); return 0; }
运行输出
看看这个运行结果,看见没有,原字符串和子字符串第3个字符都是K,这是个神奇的地方,因为这说明sub2这个子字符串没有产生实际的内存拷贝。这在字符串操作的时候将大大提高运行性能。这是一个很了不起的改进。
看官在看到这句(cast(char[])(sub2))[3] = ‘K‘; 时可能会说,赋值一个字符都要字得这么复杂。哈哈,先不要看他复杂,这是很有用的,这种方式叫做强类型语言特征,这样做可以使得你编译时(而不是运行程序的时候)就会发现问题,不会轻易的操作字符串里面的内容,因为一般很少会直接修改字符串的内容。操作大部分都使用第三方函数来完成。
又有人会想,那如果我的子字符串需要拷贝怎么办,这很简单,使用dup函数就可以完成:
import std.stdio; int main(string[] argv) { auto tmp = "Hello Honan!"; auto sub2 = tmp[0..5].dup; (cast(char[])(sub2))[3] = ‘K‘; writeln(tmp); writeln(sub2); readln(); return 0; }
auto sub2 = tmp[0..5].dup; 这一句中的dup函数就可以让字符串进行拷贝。
让我们再来看看字符的连接操作:
import std.stdio; import std.string; int main(string[] argv) { auto tmp = "Hello Honan!"; auto tmp2 = tmp ~ " end"; writeln(tmp); writeln(tmp2); readln(); return 0; }
这几个功能远远不能字符串操作的全部功能,需要更多字符串操作功能需要导入std.string包,在这个包里包含的函数有:indexOf,lastIndexOf,lastIndexOfAny,representation,capitalize,splitLines,strip,stripLeft,stripRight,
chomp,chompPrefix,chop,equal,leftJustify,rightJustify,center,detab,entab,translate,
format,sformat,xformat,xsformat,inPattern,countchars,removechars,squeeze,munch,succ,tr,
isNumeric,soundex,abbrev,column,wrap,outdent。
这么多的字符串操作,实在是太丰富了,真是牛B人的作品呀,这么多不可能一个一个地介绍,这此函数的作在string.d里有unittest例程,看看就能明白,这里只做几个重点的函数介绍:
上图是一个string.d中的单元测试 这就是unittest语法的力量,不仅能在编程里进行测试,还能把测试代码放在程序一起,让后来的使用者很清楚地知道函数是如何使用的,真是一个牛B的发明。再去看看Go语言,真的只不过是一个玩具,到使用D语言的struct的时候,让那些使用Go的人明白D语言在那方面的表现一点也不差。这才是真正值得学习的语言,能简出,更能深入。
还是先来看看字符串的几个重要操作吧。
format函数:
在处理字符串时,我们经常需要使用format函数来对字符进行格式化。
~~~~明天继续
标签:
原文地址:http://www.cnblogs.com/wanhongnan/p/5720077.html