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

时间:2011-05-12 01:55:52

标签: c++ string stl history

(当我说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状态一起提及它属于“容器”类别。< / p>

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

3 个答案:

答案 0 :(得分:28)

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

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

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

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

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

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


<强>摘要

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

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

字符串是否是“STL的一部分”取决于您是否遵循逻辑和原因,或者调用标准库“STL”。

希望这有帮助。

答案 1 :(得分:10)

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

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

答案 2 :(得分:2)

确实是STL的一部分。而std :: string只是basic_string typedef。它是容器,专用(不是c ++“specialization”意思:))用于具有字符串语义的数据存储。 虽然不知道斯捷潘诺夫。 值得一提的是,STL是“标准模板库”,不仅仅是容器子部分。这包括算法,流和一些特征。