std::string是STL的一部分吗?

37

(当我说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中有所不同吗?

10
除了出于历史上的好奇,还有谁会在这个时候关注STL呢? - ildjarn
6
我喜欢积累知识。你看到那个小的“历史”标签了吗?我对这样的事情很感兴趣,所以会问一些相关的问题。 - Xeo
2
啊,好的,我实际上没有看到history标签 :-] - ildjarn
4
STL是什么,如果不是SGI网站上定义的内容? - Benjamin Lindley
STL是否开始使用std命名空间?这难道不是被C++语言标准明确禁止的吗? - Lightness Races in Orbit
3个回答

32

不完全是,但也不完全否定。

“STL”的定义因人而异,包括:

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

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

  • 整个C++标准库。这个定义在逻辑或现实中绝对没有根据,如果遵循这个定义,则会包括std::string

请注意,自从C++标准化以来(记得是13年前),实际的STL已经发展了一些,他们向后采用了一些进入标准的东西,例如字符串。这并不意味着它们最初在1998年就存在......但现在为了“兼容性”而存在。


简述

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

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

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

希望这有所帮助。


仅有一个小注:至少在最初的发布版本中,HP STL实际上包含了一个名为bstring(基础字符串)类(不要误解为basic_string),尽管我记得它只是为了避免在简单的演示程序中应对C风格字符串而存在的(但显然他们也不想应对每个编译器都有其自己独特的字符串类)。 - Jerry Coffin

12

这个问题没有一个明确的答案。一方面,std::string 是完全独立于其他容器开发出来的;另一方面,它增加了足够的功能以满足随机访问容器的所有要求。你选择将其归为“STL”的一部分还是不归为其中完全由你决定——最终,这只是指出“STL”缺乏单一、共同认可的定义,它突然获得明确含义的可能性很小(说得好听些)。

换句话说,“STL”是一个糟糕的缩写,因为人们使用它来表示至少三种不同的东西——但不幸的是,也没有更好的缩写具有更好的定义意义,因此STL仍在使用中,并且可能会无限期地继续这样做(并继续阻碍交流)。


1

它确实是STL的一部分。而std::string只是basic_string<char>的typedef。它是一个容器,专门用于具有字符串语义的数据存储(不是C++“特化”的意思 :))。关于Stepanov我不清楚。

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


@Xeo:什么?流、算法和迭代器恰恰是从STL中为标准所适应的唯一东西。 - Lightness Races in Orbit
@Tomalak: 哦,是流。我一开始误以为是IO流,可能是因为你之前的回答也错了.. >_>" - Xeo
@Xeo:区别在哪里? - Lightness Races in Orbit
@Tomalak:等一下,IOstream 层次结构不是STL的一部分,对吧?至少不是按照我在问题开头明确表达的那种方式,是吗? - Xeo
@Xeo:哎呀,抱歉,当然流(streams)不在STL中。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接