2

任何人都知道为什么与 Qt 中的 QString 类或 Python 字符串相比,为什么 C++ 标准库的std::string类(或更一般的std::basic_string类模板)缺少普通的字符串功能,例如大写、子字符串替换和修剪等?

4

3 回答 3

6

我要试一试这...

该模板std::basic_string最初是编写并包含在STL中,它代表了我们所知道的标准库的“抽象”部分(容器、迭代器、算法、分配器等)。这也包括在内std::string

请注意STL中绝对没有编码、国际化或区域设置相关功能。这不是设计目标。

现在我对前几代发生的事情的看法:当 C++ 标准化时,需要一个全面的标准库。STL 非常适合这种情况,并且几乎被逐字接管。<iostream>直到后来才添加了类似的东西<locale>。流和字符串之间笨拙且非常不连贯的接口差异仅证明了这种“让我们把它放在一起”的态度。

与许多std设施一样,组件之间的互操作并未优化。最重要的是,包装现有 C 功能(如toupper)的小型 C++ 函数的简单性已被用作不将其包含在标准库中的原因。

通过标准的下一次修订(以及它所包含的库),向后兼容性阻止了添加任何有用和必要的更改(将语言环境注入std::string功能)。

请注意,这个猜想根本不能解释为什么std::trim没有添加一个字符串和语言环境对象。它确实试图解释所涉及的后台过程。

既然已经说了这么多,我完全同意 C++ 标准库的一般用途是笨重且不完整的。

更新:我被告知我的时间线颠倒了:标准库(和 iostream)在添加 STL 之前就已经存在。上面的观点仍然有效:STL 是复制粘贴的,几乎没有集成(简单的例子:直到最近才丢失std::basic_istream<T>::open(const std::basic_string<T>&),由于一些东西,它将在下一次迭代中被弃用std::filesystem)。

于 2012-06-21T20:34:56.850 回答
3

无法从最一般的意义上回答所有缺失的功能,但是……</p>

提到的两个功能,修剪和大写,是依赖于语言环境的。它们不仅是字符的功能,而且是所使用的编码和语言。

std::string并没有真正处理。尽管在实践中,每个人都使用 Unicode 和 ASCII 定义的空格,但这对于定义 C++ 的标准化过程来说还不够通用。

此类操作是通过流(例如,读取 astd::stringstream以去除多余空间)和语言环境对象(例如,通过 访问std::tolower)获得的。

于 2012-06-21T19:53:28.337 回答
1

功能差?被认为是标准库中臃肿的组件之一。你有一整套在 s 上运行的算法std::string,所有的标准算法。不要将自己限制在成员函数中,接口中的功能远不止这些……

于 2012-06-21T19:00:12.087 回答