(当我说STL时,我说的是围绕容器,迭代器,算法和仿函数的模板库。)
在考虑std::string
主要表现得像普通容器,begin
和end
函数(包括迭代器),size
函数以及可能性将所有这些用于通过迭代器处理容器/范围的普通STL算法(例如transform
,sort
,find
等)。
然而,与此同时,它本身并不是容器,因为它不适合存储任意数据的容器。此外,它主要通过成员函数(如substr
,find_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中是否有所不同?
答案 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是“标准模板库”,不仅仅是容器子部分。这包括算法,流和一些特征。