是 std::string 是 STL 的一部分

Is std::string part of the STL?

本文关键字:一部分 string std STL      更新时间:2023-10-16

(当我说STL时,我指的是围绕容器,迭代器,算法和函子的模板库。
在认为std::string大多表现得像普通容器,具有beginend函数(包括迭代器)、size函数以及将所有函数用于通过其迭代器在容器/范围上工作的普通 STL 算法的可能性(例如 transformsortfind等)。

然而,与此同时,它本身不是一个容器,因为它不适合存储任意数据的容器。此外,它主要通过成员函数(如substrfind_first_of等)对包含的数据进行操作,而真正的容器不会这样做,而是让算法来处理。

此外,cplusplus 参考站点和 C++ 标准不会std::string与真正的容器一起列出,而是在不同的类别中列出。
然而,在SGI的STL网站上,basic_string(以及因此string typedef)与其他容器一起被提及,basic_string参考站点声明它属于"容器"类别。

现在我的问题是,string实际上是STL的一部分,还是它本身就是一个独立的库?
如果它现在属于 STL,它与 Stepanov 开发的原始 STL 有什么不同吗?

不,不是真的。是的,有点。

「STL」有不同的定义,包括:

  • 实际的 HP/SGI STL,原始库,C++ 标准库基于其中的一部分。它们包括容器、迭代器和算法。字符串不是其中的一部分。

  • C++标准库中基于 SGI STL 库的部分:容器、迭代器和算法。仍然没有字符串。

  • 所有C++标准库。这个定义绝对没有逻辑或现实的基础,但如果遵循,std::string将被包括在内。

请注意,实际的 STL 是在标准化C++(大约 13 年前,记住)之后开发的,他们已经向后采用了标准中的一些东西,比如字符串。这并不意味着他们最初在 1998 年就在那里......但是出于"兼容性"的原因,它们现在在那里。


总结

STL是容器,算法和迭代器。

98 C++采用了弦乐和流,现代SGI STL则向采用了弦乐和流。

字符串是否是"STL 的一部分"取决于您是遵循逻辑和推理,还是将标准库称为"STL"。

希望这有帮助。

这个问题没有真正的答案。一方面,std::string是完全独立于其他容器开发的。另一方面,它有足够的附加功能来满足随机访问容器的所有要求。你是否选择将其归类为"STL"的一部分完全取决于你 - 最后,它只是指出"STL"缺乏一个单一的,商定的定义,并且它突然获得明确含义的可能性很小(说得好听)。

IOW,"STL"是一个糟糕的缩写,因为人们用它来表示至少三种不同的东西 - 但是,不幸的是,也没有更好的缩写和更好的定义的含义,所以STL仍在使用,并且可能会无限期地继续这样做(并继续阻碍通信)。

它确实是STL的一部分。而std::string只是basic_string<char>类型定义。它是容器,专门用于具有字符串语义的数据存储(不是C++"专业化"的意思是:))。不过对斯捷潘诺夫一无所知。

值得一提的是,STL是"标准模板库",而不仅仅是容器的子部分。这包括算法、流和一些特征。