C++中string的拼接

2023-05-16

字符拼接可以采用的方法:

1、多个字串拼接时用+操作符

1)

代码:

如果不加红色部分的代码,则需要采用_sntprintf代替sntprintf。

#include <iostream>
#include <string>
<span style="background-color: rgb(255, 255, 255);"><span style="color:#FF0000;">#if _MSC_VER
#define snprintf _snprintf
#endif</span></span>
using namespace std;

string intToString(int v)
{
	char buf[32] = {0};
	snprintf(buf, sizeof(buf), "%u", v);

	string str = buf;
	return str;
}
int main()
{
	string data;
	int myid=7;
	string data1=intToString(myid) ;
	string data2;
	data = "{\"status\":200, \"id\":\"" +intToString(myid) + "\"}";
	//为实现字符的相加而实现拼接,必须#include string,否则string的运算符操作无法使用。不包含该头文件下,string是可以定义使用的。这是运算操作上面不行。
	cout<<data.c_str()<<endl;
	
	return 0;
}

2)引申使用str += "a", str =str+ "a" 效率差距:

str =str+ "a"加的运算产生的是一个新的对象,再把结果返回,而str += "a" 涉及到的应该是对象的引用,操作之后直接返回引用,避免了产生新的对象。因此,两者的性能有一定的差距。

int main()
{
	static int num = 1000000;  
	time_t timeBegin, timeEnd;  
	timeBegin = time(NULL);  
	
	
	string str = "";  
	for(int i =0; i<num; i++)
	{  
		
		//      str = "";         //多一条,时间花费一些  
		str =str + "a";  
	}
	timeEnd = time(NULL);  
	cout<<"str=str +a所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl;  

	//num = 100W ,使用str += "a"表达, 花费18ms  
	timeBegin = time(NULL);  
	string str1 = "";  
	for(int i =0; i<num; i++)
	{  
		str1 += "a";  
	}
	timeEnd = time(NULL);  
	cout<<"str+=a所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl;  	
	return 0;
}
所耗费的时间差距如下图所示:差得真不是一丢丢。。。(此处用的是debug版本)

2、使用append。

        string s1 = "Hello ";
	string s2 = "World! ";
	string s3 = " China";
	string s4;
	s4.append(s1);
	cout<<s4.c_str()<<endl;
	s4.append(s2);
	cout<<s4.c_str()<<endl;
	s4.append(s3);
	cout<<s4.c_str()<<endl;
将其与str+=a进行对比:

#include <iostream>
#include <string>
#include <time.h>  

using namespace std;
//获得当前的系统时间,返回一个long类型的数据 

int main()
{
	static int num = 100000000;//这里的时间是上面的100倍
	time_t timeBegin, timeEnd;  
	
	timeBegin = time(NULL);  
	string str1 = "";  
	for(int i =0; i<num; i++)
	{  
		str1 += "a";  
	}
	timeEnd = time(NULL);  
	cout<<"str+=a 所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl; 

	timeBegin = time(NULL);  
	string str2 = "";  
	for(int i =0; i<num; i++)
	{  
		str2.append("a");  
	}
	timeEnd = time(NULL);  
	cout<<"str.append(a)所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl; 

	return 0;

}

总体运行效率差不多:



3、stringstream

结合这两种方法与上述方法进行对比:

#include <iostream>
#include <map>
#include <string>
#include <time.h>  
#include <sstream>
using namespace std;
//获得当前的系统时间,返回一个long类型的数据 

int main()
{
	static int num = 100000000;  
	time_t timeBegin, timeEnd;  
	
	timeBegin = time(NULL);  
	string str1 = "";  
	for(int i =0; i<num; i++)
	{  
		str1 += "a";  
	}
	timeEnd = time(NULL);  
	cout<<"str+=a 所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl; 

	timeBegin = time(NULL);  
	string str2 = "";  
	for(int i =0; i<num; i++)
	{  
		str2.append("a");  
	}
	timeEnd = time(NULL);  
	cout<<"str.append(a)所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl; 

	timeBegin = time(NULL);  
	string str3 = "";  
	stringstream ss;
	for(int i =0; i<num; i++)
	{  
		ss<<"a";
	}
	str3=ss.str();
	timeEnd = time(NULL);  
	cout<<"stringstream 方法所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl; 

	return 0;
}

运行结果如下:可知stringstream方法是最快的!(这里的循环次数和上面是一样,对比运行时间也是可以看出)


4、sprintf进行字符的拼接

代码:

#include <iostream>
#include <map>
#include <string>
#include <time.h>  
#include <sstream>
using namespace std;
//获得当前的系统时间,返回一个long类型的数据 
static int num = 100000000;  


int main()
{
	
	time_t timeBegin, timeEnd;  

	timeBegin = time(NULL);  
	string str1 = "";  
	for(int i =0; i<num; i++)
	{  
		str1 += "a";  
	}
	timeEnd = time(NULL);  
	cout<<"str+=a 所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl; 

	timeBegin = time(NULL);  
	string str2 = "";  
	for(int i =0; i<num; i++)
	{  
		str2.append("a");  
	}
	timeEnd = time(NULL);  
	cout<<"str.append(a)所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl; 

	timeBegin = time(NULL);  
	string str3 = "";  
	stringstream ss;
	for(int i =0; i<num; i++)
	{  
		ss<<"a";
	}
	str3=ss.str();
	timeEnd = time(NULL);  
	cout<<"stringstream 方法所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl; 

	timeBegin = time(NULL);  
	string s4 = "";
	//char tmp[5];//="abc";
	char* cp = new char [num];
	char *tt=cp;
	char *t1="a";
	size_t  strLength=sizeof(t1);
	for(int i=0; i<num; i++)
		{
			sprintf(cp,"%s",t1 );//t1所处的位置,必须是变量,不能是常理,如“a”这样的形式是不行的。
			//cout<<tt<<endl;
			cp++;
		}
	s4 = cp;
	timeEnd = time(NULL);  
	cout<<"sprintf 方法所耗费的时间:"<<timeEnd - timeBegin<<" ms"<<endl; 

	return 0;
}
运行结果如下:

从中可以知道,sprintf是目前这四者速度最快的。其次分别是stringstream、str.append和str+=a方法。

注意,sprintf是不安全的,该函数无法检查目的缓存区是否溢出,现在一般采用snprint对其进行替代使用。类似的函数还有gets,strcat和strcpy,建议分别用fgets,strncat和strncpy进行替代使用。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中string的拼接 的相关文章

随机推荐

  • python中的值传递和引用传递

    今天和大家分享python中很重要的一个知识点 xff1a 参数传递 xff0c 其中包括值传递和引用传递 目录 一 为什么要熟悉值传递和引用传递 1 1 值传递 1 2 引用传递 二 Python变量及其赋值 三 Python函数的参数传
  • MySQL8.0下DATE,DATETIME和TIMESTAMP的自动初始化和更新

    MySQL8 0下DATE DATETIME和TIMESTAMP的自动初始化和更新 DATE日期类型DATETIME和TIMESTAMP的不同什么是时区自动变动 xff1f DATETIME和TIMESTAMP的相同点微秒小数部分自动初始化
  • Python爬虫实战分析

    今天看到特别好的一篇文章 xff0c 分享给大家 从头到尾看了一遍 xff0c 以实战的例子分析爬虫所需要用到的知识点 十分受益 真可谓 xff1a python万能模板 xff0c 有了这个模板 xff0c 想爬取什么内容 xff0c 根
  • ansible dns

    1 详细叙述ansible的工作原理 工作原理 xff1a ansible是基于Python开发 xff0c 集合众多运维工具的优势 xff0c 实现批量的部署操作 xff0c ansible是基于模块化 xff0c 本身并没有部署能力 x
  • pip 安装命令 及 配置Path路径

    pip 不是内部或外部命令 也不是可运行的程序 或批处理文件 pip 安装命令 及 配置环境变量 numpy 输入pip install numpy 时 xff0c 提示 以numpy 为例 pip 不是内部或外部命令 也不是可运行的程序
  • 1-python工厂模式

    文章目录 工厂模式定义 xff1a 它的优点 xff1a 可以有如下三种实现方式1 简单工厂模式2 工厂方法模式3 抽象工厂模式总结 工厂模式定义 xff1a 在面向对象编程中 xff0c 术语 工厂 表示一个负责创建替他类型对象的类 通常
  • Facebook_Pop的使用指北

    背景 最近公司有了一个创新项目 xff0c 就是在视频视图之上添加一层视图 xff0c 视图设计涉及到了复杂的控件动画 xff0c 会根据视频的播放 xff0c 显示一些控件 xff0c 控件有位移 缩放 旋转 shake等动画 在网上调研
  • iOS Jenkins自动化打包 上传fir、蒲公英、邮件、钉钉提醒

    一 环境配置 注意 xff0c 本文章是以Jenkins2 263 4为例 1 首先安装Java环境 xff1a 官网下载地址 2 安装Jenkins 建议下载Jenkins 2 263 4版本 xff0c 因为最新版本存在login ke
  • iOS11 WKWebview App Crash闪退

    最近项目在iOS11 0 3 iOS11 1 2 iOS11 2 1 iOS 11 2 2 iOS11 2 6上面莫名其妙会崩溃 xff0c 本以为是block或者是设置User Agent导致的 xff0c 最后定位是Request设置u
  • iOS判断是否开启代理,防止Charles抓包

    直接检查是否设置了代理即可 BOOL checkProxySetting NSDictionary proxySettings 61 bridgeNSDictionary CFNetworkCopySystemProxySettings N
  • iOS 已有项目利用Pod集成RN

    一 背景 对于已经存在的iOS项目 xff0c 以模块化引入 xff0c OC与RN混编怎么做呢 xff1f 我们可以利用cocopods来集成 xff0c 直接使用pod install就可以让其他同事也快速集成 由于RN用npx rea
  • 使用信号量使AFNetworking异步变同步(dispatch_semaphore_t)

    背景 当H5调用OC的时候 xff0c 默认是在主线程的 xff0c 如果H5调用后 xff0c 需要原生返回数据 xff0c 而原生获取数据又是个耗时的异步操作就会有问题 xff0c 比如OC是一个网络请求 xff0c 那就需要等原生请求
  • Alice 与 Bob 的游戏 (概率DP)

    题目描述 Alice 和 Bob 两个人正在玩一个游戏 xff0c 游戏有很多种任务 xff0c 难度为 p 的任务 xff08 p是正整数 xff09 xff0c 有 1 2 p 的概率完成并得到 2 p 1 分 xff0c 如果完成不了
  • windows搭建WINS服务

    文章目录 SDCserver WINS 1 安装WINS并配置为辅助WINS 2 DCserver为主要的WINS服务器 3 定期复制主WINS服务器的记录 4 DCserver离线后 自动切换为辅助服务器 SDCserver设备上 提示
  • iOS 内存管理

    内存管理 1 内存布局 bss xff1a 未初始化的全局变量 静态变量等data xff1a 已初始化的全局变量 静态变量等text xff1a 程序代码 内存布局 2 内存管理方案 TaggedPointer xff1a 对于小对象NS
  • isKindOfClass和isMemberOfClass

    BOOL isKindOfClass Class aClass BOOL isMemberOfClass Class aClass 我们来看看这两个方法有什么不同 xff0c 首先看看问题 BOOL res1 61 id NSObject
  • AVAudioRecorder stop崩溃 在iOS13系统上

    iOS15和iOS16都正常 xff0c 但是测试反馈在iOS13的系统上 xff0c AVAudioRecorder的实例对象调用stop方法会崩溃 xff0c 并且debug不到任何信息 原因是由于AVAudioRecorder的实例对
  • 【C++】输入优化(快读)

    快速读入 xff0c 简称快读 xff0c 比cin printf 等都快 void类型的快读 span class token macro property span class token directive keyword inclu
  • 【LaTeX】LaTeX入门

    文章目录 简介文章结构基本要素处理问题添加文档标题章节创建标签生成目录 xff08 TOC xff09 文字处理中文字体支持字体效果彩色字体字体大小段落缩进列表注释和空格特殊字符 表格图表公式插入公式数学符号上标和下标分数根号求和与积分希腊
  • C++中string的拼接

    字符拼接可以采用的方法 xff1a 1 多个字串拼接时用 43 操作符 1 xff09 代码 xff1a 如果不加红色部分的代码 xff0c 则需要采用 sntprintf代替sntprintf include lt iostream gt