【问题标题】:Is std::string part of the STL?std::string 是 STL 的一部分吗?
【发布时间】:2011-08-23 18:33:12
【问题描述】:

(当我说 STL 时,我指的是围绕容器、迭代器、算法和仿函数的模板库。)
这个问题是在认为std::string 主要表现得像一个普通的容器,有beginend 函数(包括迭代器)、size 函数以及将所有这些用于普通 STL 算法的可能性之后想到的通过其迭代器处理容器/范围(例如transformsortfind 等)。

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

此外,cplusplus reference site 和 C++ 标准并未将 std::string 与真正的容器一起列出,而是在一个不同的类别中。
但是,在 SGI's STL site 上,basic_string(以及随后的 string typedef)与另一个容器一起被提及,basic_string reference site 声明它属于“容器”类别。

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

【问题讨论】:

  • 除了对历史的好奇之外,现在谁在乎 STL?
  • @ildjarn:嗯,我喜欢积累知识。 :P 另外,看到那个小history 标签了吗? :) 我只是对这样的东西感兴趣,所以我要求它。
  • 啊,公平,我实际上没有看到history 标签:-]
  • 什么是 STL,如果不是 SGI 站点定义的?
  • STL 是否开始使用std 命名空间?这不是 C++ 语言标准明确禁止的吗?

标签: c++ string stl history


【解决方案1】:

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

There are varying definitions of "the STL",包括:

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

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

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

请注意,自 C++ 标准化以来,实际的 STL 已经发展起来(记得大约 13 年前),并且他们已经向后采用了一些进入标准的东西,比如字符串。这确实意味着它们最初在 1998 年就在那里......但它们现在在那里是出于“兼容性”的原因。


总结

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

字符串和流被 C++98 采用,然后向后被现代 SGI STL 采用。

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

希望这会有所帮助。

【讨论】:

  • 只是一个小提示:至少在最初分发时,HP STL 实际上确实包含一个bstring(基本字符串)类(不要被误认为@ 987654324@),虽然我记得它真的只是在那里,所以他们不必在琐碎的演示程序中处理 C 风格的字符串(但他们显然不想处理每个编译器都有自己独特的字符串类)。
【解决方案2】:

对此没有真正的答案。一方面,std::string 是完全独立于其他容器开发的。另一方面,它的添加足以满足随机访问容器的所有要求。您是否选择将其归类为“STL”的一部分完全取决于您——最后,它只是指出“STL”缺乏一个单一的、公认的定义,并且它突然出现的可能性获得明确的意义是遥远的(说得好听的话)。

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

【讨论】:

    【解决方案3】:

    它确实是 STL 的一部分。而std::string 只是basic_string<char> typedef。它是容器,专门用于具有字符串语义的数据存储(不是 C++“专业化”含义:))。不过不知道 Stepanov。

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

    【讨论】:

    • @Xeo:嗯?流、算法和迭代器正是唯一从 STL 改编为标准的东西。
    • @Tomalak:哦,流。现在我把它读作 IOstreams,也许是因为你一开始在其他答案中也有这个错误.. >_>"
    • @Xeo:区别是……?
    • @Tomalak:等等。 IOstream 层次结构不是 STL 的一部分,对吗?至少不是我在问题开头明确指出的,不是吗?
    • @Xeo:糟糕,抱歉,STL 中确实不是流。
    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2019-09-10
    • 2011-06-11
    相关资源
    最近更新 更多