尽管很少有人仍在使用STL(这是由SGI设计的),但C++标准库的部分功能是基于STL的部分功能实现的,许多人(包括几位作者和以错误信息著称的cplusplus.com)仍然将其称为“STL”。然而,这是不准确的;事实上,C++标准从未提到过“STL”,而且两者之间存在内容差异。
人们认为“STL”很少用于指代基于SGI STL的stdlib的一些部分。它被放在简历上。这是具有误导性的。
我对C++的历史知之甚少,因此无法判断文章的正确性。我应该避免使用STL术语吗?还是这只是个别观点?
在C++标准化之前,"STL"是由Alexander Stepanov编写的。尽管C++存在于80年代,但我们现在所说的"C ++"是由ISO / IEC 14882:2014(以及早期版本,如ISO / IEC 14882:2011)标准化的语言。
作为C ++库,STL已经被广泛地使用,使程序员可以访问容器、迭代器和算法。当标准化发生时,语言委员会设计了C ++标准库的一些部分(它是语言标准的一部分),以非常接近STL。
多年来,许多人 - 包括著名的书籍作者和各种网站 - 仍将C ++标准库称为"STL",尽管这两个实体是独立的,并且存在一些差异。在即将到来的新版C ++标准中,这些差异更加明显,该标准包括各种特性并显着改变了一些类。
原始的STL现在通常被称为" C ++ Standard Template Library的一种实现"(与实际历史相反!),就像您的Microsoft Visual Studio或GCC提供了C ++标准库的实现一样。但是,“Standard Template Library”和“Standard Library”并不是同一件事。
争论的焦点在于当前的标准库是否应该整体或部分地称为"STL",以及它被称为什么是否重要。
支持"STL"
有一种观点认为,现在每个人都知道"STL"指的是标准库,就像每个人现在都知道"C++"是ISO标准化语言。std::iota
头文件在哪里,因为他无法让其正常工作。它是一个SGI非标准扩展,当他们认为适合时就称其为“标准”,因为它是“STL”,而每个人都知道“STL”是C++标准库的一部分,对吧?它是在C++0x中引入的,但在C++03中不可用。Grrr. - Lightness Races in Orbit没有一个确切的答案是正确的。Alexander Stepanov在任职惠普期间开发了一个他称为STL的库。然后,该库被提议纳入C++标准。
这基本上“分叉”了开发。委员会包括了一些部分,完全拒绝了其他部分,并重新设计了一些部分(与Alexander的参与)。原始库的开发后来转移到了硅谷图形公司,但与C++标准库分开进行。
在这些部分添加到标准库之后,标准库的一些其他部分被修改以更好地适应所添加的内容(例如,在std::string
中添加了begin
、end
、rbegin
和rend
,使其可以像容器一样使用)。大约在同一时间,大多数库(即使是完全不相关的部分)都被制作成模板以适应不同类型(例如,标准流)。
有些人也将STL简单地用作“STandard Library”的缩写。
这意味着当有人使用术语“STL”时,他们可能指的是大约半打不同的事物之一。无论是好是坏,大多数使用它的人似乎忽略了多样性的含义,并假设每个人都会认识他们所指的内容。这导致了许多误解,至少有几次严重的火药战使大多数参与者看起来很蠢,因为他们只是在谈论完全不同的事情。
不幸的是,这种混淆很可能会持续下去。引用“STL”比引用“C++标准库中的容器、迭代器和算法,但不包括std::string
,即使它可以像容器一样使用”更加方便。即使“C++标准库”并不像那么冗长和笨拙,“STL”仍然更短、更简单。除非有人发明出同样方便的更精确的术语(必要时),否则“STL”将继续被使用,混淆也将继续产生。
std
中添加任何内容。我所说的是“stdlib”中的“std”,它代表“standard”(标准)。“std”代表的意思相当明确! - Lightness Races in Orbitstd
添加内容是未定义行为:这些添加情况在标准中有明确的命名,因此仍然完全合规;“standard”仍然适用。 - Lightness Races in Orbitstd
命名空间(如果我没记错的话),但仍然如此。 - Lightness Races in Orbit我最近也提出了这个观点,但我认为应该容许一些宽容度。如果Scott Meyers犯了同样的错误,那你就有了一个好榜样。
std::string
,而它已经被装备成为一个完整的STL容器。 - sbiSTL(标准模板库)是C++标准库的很大一部分灵感来源,但两者术语不可互换,并且它们的含义不相同。C++标准库包括许多并非来自STL的东西,其中一些甚至不是模板,例如std::locale
和std::thread
。
Libstdc++-v3将很多代码从SGI STL中整合过来(最终合并版本为3.3版)。与原始的SGI代码相比,libstdc++中的代码包含了许多修复和更改。
特别地,string
并非来自SGI,也没有使用他们的“rope”类(虽然作为可选扩展包含在内),valarray
和其他一些类也不是。像vector<>
这样的类来自SGI,但已被广泛修改。
有关libstdc++演化的更多信息,请参见API演化和向后兼容性文档。
仍然建议阅读SGI的STL常见问题解答。
提供信息,截至2018年3月,官方STL网站www.sgi.com/tech/stl/已经消失。
标准函数库 -输入/输出, -字符串和字符处理, -数学, -时间、日期和本地化, -动态分配, -杂项, -宽字符函数
标准面向对象编程和泛型库 -标准C++ I/O类 -字符串类 -数字类 -STL容器类 -STL算法 -STL函数对象 -STL迭代器 -STL分配器 -本地化库 -异常处理类 -杂项支持库
C++标准库的内容包括:
因此,请不要将C++标准库与STL混淆。