zoukankan      html  css  js  c++  java
  • C++的string连接(a = a + b 与 a += b)

    
    大一学习C语言的时候,书上就写着a = a + b与 a += b等价,但是提倡用后者。
    
    在CSDN上也看到一个关于a+=b和a=a+b的区别的帖子,大概内容如下:
    ------------------------------------------------------------------------------------------------------------------------------------------
    楼主:为什么要强调使用   a+=b   而不建议使用a=a+b
    我想在编译上应该是一样的啊
    add   a   b
    就算是间接寻址也应该一样啊 
    
    以下是各位高人的回答:
    
    1 楼mLee79()回复于 2006-11-15 21:14:23 得分 0 
    打字快些,鉴定完毕   ...
    
    6 楼wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也)回复于 2006-11-15 22:03:26 得分 1
    a+=b       这个性能高
    作了优化
    
    33 楼miniplayer(为了我的公主)回复于 2006-11-16 10:47:55 得分 0 
    少打一个a
    故节省时间
    
    41 楼Darc(注册真烦)回复于 2006-11-16 12:58:43 得分 0 
    可以少打一个a.
    好处显而易见,第一,Coding速度提高一点点。第二,延长键盘上“A”键的寿命。
    ----------------------------------------------------------------------------------------------------------------------------------------------
    
    今天在运行一段C++程序的时候,发现效率很低,经过不断的测试,最后发现是循环中的字符串连接(直接使用的a = a + b形式的连接方式)消耗了程序运行的大部分时间,上网查了一下C++中string的方法,有4种方法向string后面加字符和字符串(string a, b):
    
    1. a = a + b;
    2. a += b;
    3. a.append(b);
    4. push_back();    //这个的用法暂时还没去看。
    
    然后我写了一个小程序来测试前三种方法的执行效率:
    -------------------------------------------------------------------------------------------------------------------------------------------
    string s1,s2,s3;
    string str = "abc";
    
    cout << "1 :" ; getTime();                  //时间1,第1个函数运行开始
    for(int i = 0; i < n; i++)
    {
    s1 = s1 + str;
    }
    
    cout << "2 :" ; getTime();                  //时间2,第1个结束,第2个开始
    for(int i = 0; i < n; i++)
    {
    s2 += str;
    }
    
    cout << "3 :" ; getTime();                  //时间3,第2个结束,第3个开始
    for(int i = 0; i < n; i++)
    {
    s3.append(str);
    }
    cout << "4 :" ; getTime();                  //时间4,第3个函数运行结束
    ----------------------------------------------------------------------------------------------------------------------------------------------
    当n = 100000的时候,结果如下:
    [yurocy@localhost test_programme]$ ./string
    1 : 2009/10/15 20:01:07 
    2 : 2009/10/15 20:01:10 
    3 : 2009/10/15 20:01:10 
    3 : 2009/10/15 20:01:10 
    第一个函数运行用了3秒钟,后面两个的时间可以忽略。
    
    当n = 500000的时候,结果如下:
    [yurocy@localhost test_programme]$ ./string
    1 : 2009/10/15 20:13:00 
    2 : 2009/10/15 20:15:50 
    3 : 2009/10/15 20:15:50 
    3 : 2009/10/15 20:15:50 
    第一个函数居然用了2分50秒,后面两个的时间还是1秒以内。
    
    当n = 1000000的时候,等了几分钟,第一个都没运行出来。
    
    差别真是太大了。。。将程序中的 “+” 换成 “+=”,效率马上提高了好几倍。
    
    当然,在Java里面也有这个问题,那就是String和StringBuffer的区别了。

  • 相关阅读:
    Django orm self 自关联表
    postgresql数据库导入导出
    celery在项目中的使用
    P3405 [USACO16DEC]Cities and States S 【map使用】
    P1030 求先序排列 【已知中序后序求先序】
    P1305 新二叉树 【寻找根节点进行先序遍历】
    P1229 遍历问题 【已知先序后序求中序种类】
    P1364 医院设置 【带权值的树的重心】
    P3884 [JLOI2009]二叉树问题 【离线tarjan或数的向上遍历】
    P1827 [USACO3.4]美国血统 American Heritage【树的遍历】
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318366.html
Copyright © 2011-2022 走看看