c++中CString和String
今天发现在许多代码模块中运用均为CString而非的String类型。进行查询后,对CString和String区别进行以下归纳总结:1、使用的头文件及定义。1)string所运用的头文件string是c++标准库头文件,包含了拟容器class std::string的声明,属于STL范畴,有许多内置函数。2)CString运用头文件为cstring,是C标准库头文件。string.h的C++标准
今天发现在许多代码模块中运用均为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。
更多推荐
所有评论(0)