今天发现在许多代码模块中运用均为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;elsecout << "string类型字符串结尾没有\'\\0\'" << endl;if (str2[3] == '\0')cout << "CString类型字符串结尾有\'\\0\'" << endl;elsecout << "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);//appendfor (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。

c++中CString和String相关推荐

  1. MFC中CString,int,string,char * ,char[] 之间互转

    <1> (1)string 转 CString  CString.format("%s", string.c_str());   (2)char 转 CStri ...

  2. C++头文件中cstring和string的区别

    1.string与cstring有什么区别 是C++标准库头文件,包含了拟容器class std::string的声明(不过class string事实上只是basic_string的typedef) ...

  3. MFCC中CString, int, string, char之间的转换

    1.    CString  -->  char* (1)传给未分配内存的指针 CString cstr ="ASDDSD"; char *ch =cstr.GetBuffe ...

  4. MFC中的CString.Format及CString,string,char*之间的转换

    1.CString.Format的使用:https://blog.csdn.net/wangkaishou/article/details/5846152 2.CString,string,char* ...

  5. OpenCV中的cv::String和CString互相转换

    请注意是cv::String,而不是std::string,第一个字母是大写的. 基本上CString转cv::String网上都能查到,而cv::String转CString没有人提到 1. CSt ...

  6. MFC中CString.format用法

    MFC中CString.Format的详细用法 收藏  在MFC程序中,使用CString来处理字符串是一个很不错的选择. CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的 ...

  7. CString与string、char*的区别和转换

    我们在C++的开发中经常会碰到string.char*以及CString,这三种都表示字符串类型,有很多相似又不同的地方,常常让人混淆.下面详细介绍这三者的区别.联系和转换: 各自的区别 char*: ...

  8. MFC C++ Cstring与string互转

    CString 转换成string 我试了很多的方法,都不行,我用的vs2010 ------解决方案-------------------- unicode: CString sz1 = L&quo ...

  9. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

最新文章

  1. 以太坊公链私链_如何使用以太坊构建汽车制造供应链系统
  2. 渥太华大学药学院院长Daniel Figeys团队诚邀药物-微生物组方向博士后
  3. 逻辑回归Logistic Regression 之基础知识准备
  4. 2020-10-27(汇编收获)
  5. STL系列之一 deque双向队列
  6. java main启动spring_gradle 搭建springMVC项目,main函数启动
  7. C#下如何实现服务器 + 客户端的聊天程序
  8. 单总线和i2c总线结合实现数字温度计的设计c语言程序,1《单片机原理应用》课程设计指导书2010-6-8.doc...
  9. ExtJs4 笔记(12) Ext.toolbar.Toolbar 工具栏、Ext.toolbar.Paging 分页栏、Ext.ux.statusbar.StatusBar 状态栏...
  10. pythonyield详解_yield详解
  11. 开发老铁们,就参考这个图灵畅销新书书单加购!
  12. GrandTotal for Mac v7.2.2 发票收据预算设计软件
  13. 软件构造(三) 软件构造过程与配置管理
  14. linux 进程带宽限制,Linux限制网络带宽的占用
  15. 小丁是怎样入门git的
  16. 总结-互联网校招面试锦囊
  17. NMS by Representative Region: Towards Crowded Pedestrian Detection by Proposal Pairing论文笔记
  18. xp支持python最高版本是多少_PYQT5-开发向下兼容到xp系统的windows软件
  19. 比较便宜的云服务器哪里有,好用吗?
  20. 计算机短路计算基本原理,第八章第五节短路计算计算机算法.doc

热门文章

  1. 2022年第三次面试,含泪整理万字面试题。
  2. Mysql多表查询,获取部门最高工资的sql语句方案
  3. 「从 Windows 到 macOS」快速理顺两大系统之间的差异
  4. 黑群号 阿里云 frp
  5. 风影总结NHibernate4 NHibernateBase帮助类详解
  6. C# 人民币(RMB)转化为大写字母
  7. 张粤磊:从杂牌野战军到王牌正规军的蜕变
  8. 每日一犬 · 波尔多犬
  9. H5学习之旅-H5的基本标签(2)
  10. 【原创】C#玩高频数字彩快3的一点体会