C++中string append函数的使用与字符串拼接「建议收藏」

C++中string append函数的使用与字符串拼接「建议收藏」常用的函数原型:basic_string&append(constbasic_string&str);basic_string&append(constchar*str);basic_string&append(constbasic_string&str,size_typeindex,size

大家好,又见面了,我是你们的朋友全栈君。

1. append函数

常用的函数原型:

  basic_string &append( const basic_string &str );
  basic_string &append( const char *str );
  basic_string &append( const basic_string &str, size_type index, size_type len );
  basic_string &append( const char *str, size_type num );
  basic_string &append( size_type num, char ch );
  basic_string &append( input_iterator start, input_iterator end );

append() 函数可以完成以下工作:

在字符串的末尾添加str,
在字符串的末尾添加str的子串,子串以index索引开始,长度为len
在字符串的末尾添加str中的num个字符,
在字符串的末尾添加num个字符ch,
在字符串的末尾添加以迭代器start和end表示的字符序列.

append函数常用的三个功能:

  • 直接添加另一个完整的字符串:如str1.append(str2);
  • 添加另一个字符串的某一段子串:如str1.append(str2, 11, 7);
  • 添加几个相同的字符:如str1.append(5, ‘.’);注意,个数在前字符在后.上面的代码意思为在str1后面添加5个”.”
 //======================================== 
#include<iostream> 
using namespace std;  
//======================================== 
int main()  
  
{ 
     
    string str1="I like C++";  
    string str2=",I like the world.";  
    string str3="Hello";  
    string str4("Hi");  
    //==================================== 
    str1.append(str2);  
    str3.append(str2, 11, 7);  
    str4.append(5, '.');  
    //==================================== 
    cout<<str1<<endl;  
    cout<<str3<<endl;  
    cout<<str4<<endl;  
    system("pause");  
    return 0;     
}  
//========================================

运行结果为

I like C++,I like the world.
Hello World.
Hi.....

2. push_back函数

函数原型:

void push_back(
    value_type _Ch
);

功能:将字符添加到字符串的末尾,注意是字符而不是字符串。相当于basic_string &append( size_type num, char ch );,其中num=1。

my_str.push_back("123");//错误
my_str.push_back('1');//ok

3. 使用+=拼接

重载操作符原型:

basic_string<CharType, Traits, Allocator>& operator+=( value_type _Ch ); basic_string<CharType, Traits, Allocator>& operator+=( const value_type* _Ptr ); basic_string<CharType, Traits, Allocator>& operator+=( const basic_string<CharType, Traits, Allocator>& _Right );

使用示例:

std::string my_str = "holiday"; 
std::string my_str_add = "error" + "error";//错误 
std::string my_str_add2 = my_str + "right"; 
std::string my_str_add3 = my_str + "right" + "right"; 
std::string my_str_add4 = "right" + my_str; 
std::string my_str_add5 = "error" + "error" + my_str;//错误

+=操作符和append函数有什么区别呢,可以看下面的一个例子:

#include <iostream>
#include <string>
using namespace std;
 
int main()
{ 
   
	{ 
   
		char szTest[] = "\0abc";
		string s;
		s += szTest;
		printf("size is %u\n", s.size());
	} 
 
	{ 
   
		char szTest[] = "\0abc";
		string s;
		s.append(szTest, sizeof(szTest) - 1);
		printf("size is %u\n", s.size());
	} 
 
	return 0;
}

结果分别是0和4, 不言而喻, string就是一个容器, 用来装字符, 对任何字符透明。

4. 使用sprintf拼接

使用示例:

#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);
    }
}
//测试sprintf函数
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;
    }

}

原文链接:

  1. C++ string append方法的常用用法
  2. 实战c++中的string系列–string的连接(+= or append or push_back)
  3. c++拼接字符串效率比较(+=、append、stringstream、sprintf)
    4 . C++ string的+=与append, 小程序欣赏
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149503.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • origin画图记录[通俗易懂]

    origin画图记录[通俗易懂]origin画图记录折线图折线图origin存放数据的Book其实和excel的sheet很相似,画图的操作也有一定的相似性,只是origin比excel的功能更加强大。首先打开安装好的origin软件,其界面如下图所示:画线状图时,直接选中需要画图的数据,然后选择plot—Line—Line,即可画出对应的折线图,但是此时画出的折线图巨丑,重点时后续对它的美化。对绘制图形的美化以及一些常用功能:这个手掌的图形主要是用于移动、缩放图形中白色画板,效果如下:对坐标轴(刻度、

    2022年9月21日
    5
  • 二叉树算法(java)

    为什么实用二叉树一,在有序数组中插入删除数据太慢   1插入或者删除一条数据会移动后面的所有数据 二,在链表中查找数据太慢  2查找只能从头或者尾部一条一条的找用树解决问题   有没有一种插入和删除像链表那么快,查询可以向有序数组一样查得快那样就好了。 数实现了这些特点,称为了最有意思的数据结构之一树的术语如下图树分平衡树和非平衡树二叉树的类publicclassTree{ …

    2022年4月9日
    39
  • 游戏建模:手绘暗黑小萝莉「建议收藏」

    平时喜欢画画,最近呐再做一些个人作品。然后再A站各种淘原画,从一堆原画中挑选自己喜欢的,把它画成模型。然后发现选的原画每次都给自己挖了很多的坑。在选这张原画的时候想的是,小萝莉卡哇伊。一身金闪闪发光blingbling的,贼漂酿。头发直接就是一个条一个条的,全身除了头上的装饰还有肩部的就没啥了,还是ok的。但是在实际的模型制作还有贴图制作中发现,emmmm,有一个深坑,快爬不出来了。谁来救一下可爱的小哥哥。下面呐就是我选的卡哇伊小姐姐。挑战一下这种非正常肤色。(图1原画)下面呐…

    2022年4月11日
    48
  • 开心农场外挂助手_开心农场最新版本下载

    开心农场外挂助手_开心农场最新版本下载开心农场外挂助手,支持校内开心农场、校内开心农民、QQ校友开心农场、开心网001花园、开心网农场作用:1、自动倒计时,到朋友作物即将成熟前提醒你。2、不会错过好友的任何一个水果。偷东西一个都不会少。3、时间支持小时的输入;支持关机倒计时。4、支持自定义声音提醒、图标闪烁提醒使用方法:1、添加数据:直接在表格里填写好友标记、时间(分,最近成熟时间)2、添加完毕后,可最小化(就是X按钮)。去干其他事情…

    2025年11月10日
    2
  • springboot整合mybatis实现增删改查

    springboot整合mybatis实现增删改查立志存高远,笃行践初心三更灯火五更鸡,正是男儿读书时。黑发不知勤学早,白首方悔读书迟。立志,标定人生方向;奋斗,创造人生价值,二者相辅相成,互相促进。大部分程序员的「目标」都是成为一名优秀的工程师,一名可以统览全局的「架构师」。千里之行始于足下对于大部分普通人而言,成为一名优秀的架构师还是有一定难度的,「千里之行始于足下,一步一个脚印,慢慢来」。????粉丝专属福利:包邮送书3本,如下书单四选一。????获取方式:1、参与文末投票,点赞,收藏即有机会获得精

    2022年6月15日
    30
  • Apache 安装与配置「建议收藏」

    Apache 安装与配置「建议收藏」一、下载http://httpd.apache.org/download.cgi二、安装安装过程很简单,因为是压缩包,所以,先将其解压包中的Apache24解压到合适的位置,我将其解压到了D盘soft目录。配置找到D:\soft\Apache24\conf\httpd.conf文件,用记事本打开,找到DefineSRVROOT…

    2022年9月21日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号