C++string字符串拼接遇到的问题及解决

 更新时间:2023年07月31日 17:00:24   作者:万能的小陈  
这篇文章主要介绍了C++string字符串拼接遇到的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

C++string字符串拼接问题

C++ 字符串拼接

最初尝试

//目的: 把字符串student_ 和A拼接起来
string nameseed = "ABCDE";
string name;
name="student_" +nameseed[0];
cout<<"拼接后的字符串:"<<name<<endl;

输出:拼接后的字符串:ange

运行结果

再次尝试

方法1

string nameseed = "ABCDE";
string name;
name = std::string("student_")+ nameseed[0];
cout<<"拼接后的字符串:"<<name<<endl;

输出:拼接后的字符串:student_A

方法2

string nameseed = "ABCDE";
string name;
name = "student_";
name += nameseed[0];
cout << "拼接后的字符串:" << name << endl;

输出:拼接后的字符串:student_A

心得

对于string类变量,我们可以直接用“+”或者“+=”进行字符串的连接。

  • 用“+”进行字符串连接时,操作符左右两边既可以都是string类变量,也可以是一个string类变量和一个C风格的字符串,还可以是一个string字符串和一个char型字符。
  • 用“+=”进行字符串连接时,操作符右边既可以是一个string字符串,也可以是一个C风格字符串或一个char型字符。

上述两种方法:左边必须是string类字符串。

string类字符串进行连接时,c++中默认"student_"字符串为char*型,而不是我们想象中的string类变量,而"student_"又处在等式的最左边,所以并没有实现我们想要的目的。

C++字符串拼接性能测试

测试说明

本文对C++字符串拼接操作的四种运行:+=、append、stringstream、sprintf 进行简单的性能测试,

测试方法

比较方法是写了4个函数,分别用+=、append、stringstream、sprintf的方式来拼接字符串,拼接方法是将 s1=“abcedfg”,s2=“hijklmn”,s3="opqrst"三个字符串拼接到一起,总共循环60次。

然后在main函数中依次调用这4 个函数,并打时间戳来计时。为了使时间差异更明显,可以取循环N(N可以为100或是1000000等)次调用的时间。

测试结果

下表显示的为进行时间,单位为 μ \mu μs.

操作\循环次数1,000,000100,00010,0001,000100
+=3,405,450337,22932,1773,402369
append()4,020,078401,71940,2654,074429
Sstime7,835,499788,24278,9287,984921
sprintf14,875,4331,517,999150,83915,4251,591

源代码

#include <iostream>
#include <string>
#include <sys/time.h>
#include <sstream>
#include <stdio.h>
using namespace std;
#define OUT_IN_REPEATE_NUM 10000
#define IN_REPEATE_NUM 60
string s1="abcedfg";
string s2="hijklmn";
string s3="opqrst";
void  plusTest(string& ret)
{
    for(int i=0; i<IN_REPEATE_NUM; i++)
    {
        ret += s1;
        ret += s2;
        ret += s3;
    }
}
void  appendTest(string& ret)
{
    for(int i=0; i<IN_REPEATE_NUM; i++)
    {
        ret.append(s1);
        ret.append(s2);
        ret.append(s3);
    }
}
void sprintfTest(string& ret)
{
    const size_t length=26*IN_REPEATE_NUM;
    char tmp[length];
    char* cp = tmp;
    size_t strLength=s1.length()+s2.length()+s3.length();
    for(int i=0; i<IN_REPEATE_NUM; i++)
    {
        sprintf(cp,"%s%s%s", s1.c_str(), s2.c_str(),s3.c_str());
        cp+=strLength;
    }
    ret = tmp;
}
void  ssTest(string& ret)
{
    stringstream ss;
    for(int i=0; i<IN_REPEATE_NUM; i++)
    {
        ss<<s1;
        ss<<s2;
        ss<<s3;
    }
    ret = ss.str();
}
int main() {
    string ss, plus, append, sprintf;
    struct timeval sTime, eTime;
    gettimeofday(&sTime, NULL);
    for(int i=0; i<OUT_IN_REPEATE_NUM; i++)
    {
        sprintf="";
        sprintfTest(sprintf);
    }
    gettimeofday(&eTime, NULL);
    long SprintfTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒
    gettimeofday(&sTime, NULL);
    for(int i=0; i<OUT_IN_REPEATE_NUM; i++)
    {
        append="";
        appendTest(append);
    }
    gettimeofday(&eTime, NULL);
    long AppendTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒
    gettimeofday(&sTime, NULL);
    for(int i=0; i<OUT_IN_REPEATE_NUM; i++)
    {
        ss="";
        ssTest(ss);
    }
    gettimeofday(&eTime, NULL);
    long SsTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒
    gettimeofday(&sTime, NULL);
    for(int i=0; i<OUT_IN_REPEATE_NUM; i++)
    {
        plus="";
        plusTest(plus);
    }
    gettimeofday(&eTime, NULL);
    long PlusTime = (eTime.tv_sec-sTime.tv_sec)*1000000+(eTime.tv_usec-sTime.tv_usec); //exeTime 单位是微秒
    cout<<"PlusTime is :   "<<PlusTime<<endl;
    cout<<"AppendTime is : "<<AppendTime<<endl;
    cout<<"SsTime is :     "<<SsTime<<endl;
    cout<<"SprintfTime is :"<<SprintfTime<<endl;
    if(ss==sprintf && append==plus && ss==plus)
    {
        cout<<"They are same"<<endl;
    }
    else
    {
        cout<<"Different!"<<endl;
        cout<<"Sprintf: "<<sprintf<<endl;
        cout<<"ss:        "<<ss<<endl;
        cout<<"Plus:     "<<plus<<endl;
        cout<<"Append:"<<append<<endl;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++日期与时间 chrono库介绍及使用教程

    C++日期与时间 chrono库介绍及使用教程

    chrono库是C++11中的一个标准库,它提供了一系列与时间相关的类和函数,用于表示和处理时间间隔,时钟和时间点,C++20新增Calendar,这篇文章主要介绍了C++日期与时间 chrono库介绍及使用,需要的朋友可以参考下
    2023-12-12
  • C++用winapi socket实现局域网语音通话功能

    C++用winapi socket实现局域网语音通话功能

    这篇文章主要介绍了socket实现局域网语音通话 c++ winapi,功能介绍支持录音设备查找以及播放设备查找,支持局域网语音通话,通话包含语音来电提醒和挂断电话的提示信息,还能实时的获取在线用户的数量以及对应的id,需要的的朋友一起看看
    2022-06-06
  • C++判断pe文件实例

    C++判断pe文件实例

    这篇文章主要介绍了C++判断pe文件的方法,包含了文件操作的具体实现方法,具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C++ 容器中map和unordered map区别详解

    C++ 容器中map和unordered map区别详解

    这篇文章主要为大家介绍了C++ 容器中map和unordered map区别示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • C语言实现推箱子游戏完整代码

    C语言实现推箱子游戏完整代码

    这篇文章主要为大家详细介绍了C语言实现推箱子游戏完整代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C++标准库实现WAV文件读写的操作

    C++标准库实现WAV文件读写的操作

    本文将使用标准C++库实现对数据为PCM格式的WAV文件的读写操作,只使用标准C++库函数,不依赖于其他的库,对C++标准库实现WAV文件读写相关知识感兴趣的朋友一起看看吧
    2022-01-01
  • QT实现提示右下角冒泡效果

    QT实现提示右下角冒泡效果

    这篇文章主要为大家详细介绍了QT实现提示右下角冒泡效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Qt快速读取大文件最后一行内容解决方案

    Qt快速读取大文件最后一行内容解决方案

    这篇文章主要给大家介绍了关于Qt如何快速读取大文件最后一行内容的解决方案,文中通过代码介绍的非常详细,对大家学习或者使用Qt具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • 用C语言实现简单扫雷小游戏

    用C语言实现简单扫雷小游戏

    这篇文章主要为大家详细介绍了用C语言实现简单扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 使用代码验证linux子进程与父进程的关系

    使用代码验证linux子进程与父进程的关系

    Linux下父进程可以使用fork 函数创建子进程,但是当父进程先退出后,子进程会不会也退出呢?通过下面这个小实验,我们能够很好的看出来
    2014-02-02

最新评论