码迷,mamicode.com
首页 > 编程语言 > 详细

D语言中字符串的操作

时间:2016-07-30 06:51:19      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

       字符串的操作在软件开发中是特别重要的一个事情,因为基本上的编程都会使用到字符串,字符串操作的好坏决定着一个语言的好与差。在我做过的一个项目中曾经就出现过字符串操作性能问题。     

       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函数来对字符进行格式化。

 

 

~~~~明天继续

D语言中字符串的操作

标签:

原文地址:http://www.cnblogs.com/wanhongnan/p/5720077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!