今天发现在许多代码模块中运用均为CString而非的String类型。
进行查询后,对CString和String区别进行以下归纳总结:
1、使用的头文件及定义。
1)string所运用的头文件string是c++标准库头文件,包含了拟容器class std::string的声明,属于STL范畴,有许多内置函数。

2)CString运用头文件为cstring,是C标准库头文件,string.h的C++标准库版本。
包含了C风格字符串(即’\0’结尾字符串)相关的一些类型和函数的声明。
例如strcmp、strchr、strstr等。
为MFC中的字符串类。
注意:这里string和string.h完全不同,string用于c++中,在运用string类型前作为头文件;而string.h运用与C中,而c++中的头文件cstring兼容了string.h。

问题:既然CString以’\0’结尾,那么string类型呢。

#include <iostream>
#include <string>
#include <atlstr.h>
using namespace std;
/*
关于CString使用的头文件说明:
1、使用MFC的情况下,包含头文件cstringt.h
2、不使用MFC:包含atlstr.h   或者 #include <afx.h>
*/

int main()
{
	string str1 = "abc";
	CString str2 = _T("abc");

	if (str1[3] == '\0')
		cout << "string类型字符串结尾有\'\\0\'" << endl;
	else
		cout << "string类型字符串结尾没有\'\\0\'" << endl;
	
	if (str2[3] == '\0')
		cout << "CString类型字符串结尾有\'\\0\'" << endl;
	else
		cout << "CString类型字符串结尾没有\'\\0\'" << endl;

	//cout << str1.length() << endl;也可以求str1的大小
	cout << str1.size() << endl;
	
	//需要注意的是,这里不能用sizeof获取CString中字符串的大小
	//因为sizeof获取的为类对象的大小,而不是字符串的长度
	cout << str2.GetLength() << endl;
	return 0;
}

输出结果如下,两者结尾都有\0且长度相等。
在这里插入图片描述

查了一下,结论:string类型结尾的\0时有时无(由于编译器不同)

2、声明的名称内存分布。
<string.h>全局命名空间,位于std命名空间中。

3、运算。
string可以进行+的运算,进行字符串拼接,而CString不可以。

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main()
{
	string str1 = "hello";
	string str2 = " world";
	string num1 = str1 + str2;
	cout << num1 << endl;
}

程序中将str1和str2进行拼接,输出结果为hello word。
在这里插入图片描述
为了查看在string类型进行函数拼接时的效率,在进行查看以后发现一个很详尽的帖子,可以从链接中直接到达。
添加链接描述
对链接中的函数进行实现,定义以下函数,分别对= + ,+= ,append ,stringstream的效率做一统计。
在此时遇到了一个问题,运行时报错显示变量已被优化掉。
在这里插入图片描述
右键项目->属性->将优化改为已禁用。
在这里插入图片描述
…但是不知道为什么,程序没有报错也不出结果,在最初进入循环时就会有问题,此处将有错误的代码进行一个记录,以后有机会再改吧。

#include <iostream>
#include <string>
#include <cstring>
#include <time.h> 
#include <sstream>
using namespace std;

int main()
{
	int num = 10000000;
	string str1, str2, str3, str4, str5;
	str1 = str2 = str3 = str4 = str5 = " ";
	string a = "a";
	time_t timeBegin1, timeEnd1;
	time_t timeBegin2, timeEnd2;
	time_t timeBegin3, timeEnd3;
	time_t timeBegin4, timeEnd4;
	time_t timeBegin5, timeEnd5;

	timeBegin1 = time(NULL);//= +
	for (int i = 0 ; i < num ; i++)
	{
		str1 = str1 + a ;
	}
	timeEnd1 = time(NULL);

	timeBegin2 = time(NULL);// +=
	for (int i = 0; i < num; i++)
	{
		str2 += a;
	}
	timeEnd2 = time(NULL);

	timeBegin3 = time(NULL);//append
	for (int i = 0; i < num; i++)
	{
		str3.append(a);
	}
	timeEnd3 = time(NULL);

	timeBegin4 = time(NULL);//stringstream, 这里需要注意生命头文件#include <sstream>
	stringstream s;
	for (int i = 0; i < num; i++)
	{
		s << a;
	}
	str4 = s.str();
	timeEnd4 = time(NULL);

	cout <<"str1 = str1 + a 花费时间为:"<< timeBegin1 - timeEnd1 << " ms" << endl;
	cout << "str1 += a 花费时间为:" << timeBegin2 - timeEnd2 << " ms" << endl;
	cout << "str1.append(a) 花费时间为:" << timeBegin3 - timeEnd3 << " ms" << endl;
	cout << "stringstream 花费时间为:" << timeBegin4 - timeEnd4 << " ms" << endl;
}

虽然程序没有运行出来,但还是得到了结论。对于效率而言,(= +) < (+= )< append < stringstream
其中 str +=a比str = str + a效率高,这是因为前者直接的对象的引用,操作之后直接返回引用,避免了新对象的产生,而后者则是需要产生一个中间量负责存放str + a的值,然后再将这个值赋给str。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐