为什么每个C ++平台都有不同的字符串类?

时间:2009-10-24 19:12:07

标签: c++ string frameworks

虽然我喜欢用C ++编程,但我不喜欢这样的想法:
std::basic_string vs QString vs wxString vs .............
standard string类不满足这些框架的需求吗?我的意思是standard string类出了什么问题?!

请注意,以下是重要问题:
您是否在要使用的每个框架中学习框架的“字符串”类?您是否会通过尝试在任何地方进行调整来坚持使用标准字符串类?

...谢谢

7 个答案:

答案 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 *缓冲区和大小参数。

所以,是的,学习备用字符串类。如果你正在使用一个库(并希望熟练使用它),你不能仅仅因为“它是另一个字符串类”而决定忽略部分库。这毫无意义。