虽然我喜欢用C ++编程,但我不喜欢这样的想法:
std::basic_string
vs
QString
vs
wxString
vs .............
standard string
类不满足这些框架的需求吗?我的意思是standard string
类出了什么问题?!
请注意,以下是重要问题:
您是否在要使用的每个框架中学习框架的“字符串”类?您是否会通过尝试在任何地方进行调整来坚持使用标准字符串类?
...谢谢
答案 0 :(得分:14)
多个字符串类的原因是C ++标准很晚才完成(1998年);然后花了一些时间,直到所有系统实际提供了正确的C ++库。到那时,所有这些竞争的字符串类已经写好了。
此外,在某些情况下,人们希望从单个基类继承,std :: string不会这样做。
答案 1 :(得分:8)
IMO,std :: string的规模还不够广泛(Qt和wxWidgets比STL旧,或者至少比广泛使用的稳定和工作STL更老)。另外,std :: string很遗憾不是每个人都有的最好的字符串类,其他框架也有其他需求。
注意!以下段落略有不正确,但仍保留了意见。
例如,C ++ STL是非常受资源限制的,而Qt字符串类提供了很多东西,而委员会永远不会同意这一点,特别是有些人希望它可以在嵌入式系统等上轻松实现。 / em>的
答案 2 :(得分:7)
std::string
的一个主要问题是缺乏Unicode支持。即使使用std::wstring
,您只能获得Unicode代码点的容器,但仍需要实现支持Unicode的功能。
此外,QString
例如是“隐式共享”。这使得以有效的方式在代码中传递字符串变得非常容易。它们实际上只在写入时被复制。
答案 3 :(得分:5)
一个合理的原因(与“我不想学习标准库”这样的不合理的原因)是某些库希望保留对二进制布局的控制,以实现某些类型的互操作性(例如二进制兼容性)跨版本)。一个例子是VC ++库中的_bstr_t;对于COM来说,重要的是_bstr_t表示为BSTR(因为这是COM需要的),因此构建在BSTR之上的包装对COM开发人员很有价值。
答案 4 :(得分:2)
IIRC Bjarne Stroustrup故意从C ++中省略了一个String类,因为他认为这是一个“通过仪式”。所有学过C ++的人都应该写自己的。当然,在C ++开始时,没有标准库,我记得来自AT& T(这是C的预处理器)的版本和来自美国国立卫生研究院非常开创性小组的NIH课程(其中也包括早期版本)集合类)。
答案 5 :(得分:2)
std :: string很棒......哦,除了它没有“Format()”调用......而且,它没有Split()或Join()......实际上,它并没有做很多事情,那些“劣等”脚本语言的字符串用户认为是理所当然的......
如果C ++能够添加到现有的类(如Objective-C或Ruby),那么你可能不会看到这个......
另外,考虑到C ++在创建与真实本机类型相似的对象时通常会做得比Java更好......
答案 6 :(得分:0)
C ++的一个租户是“你不为你不需要的东西买单。”这意味着不需要每个C ++程序员必须知道并且(更重要的是)必须使用的一个通用的字符串类。也许你的项目需要线程安全的字符串。你可以自己上课。您始终可以选择使用现有的std :: string。
在大多数情况下,std :: string足够好了。但是当它不存在时,你是不是很高兴你没有被锁定。尝试用Java滚动你自己的String类,看看你拔出头发需要多长时间。
关于你的第二点,如果你打算与你已经添加到项目中的图书馆作斗争,为什么你首先要将图书馆添加到你的项目中?使用wxWidgets或QT的部分决定是确认您必须在项目中包含其字符串类(或至少是该项目的相当大一部分)。就像对“C”库的决定意味着在所有函数上放置char *缓冲区和大小参数。
所以,是的,学习备用字符串类。如果你正在使用一个库(并希望熟练使用它),你不能仅仅因为“它是另一个字符串类”而决定忽略部分库。这毫无意义。