作为一名C ++初级程序员,我注意到无论你使用什么IDE /编译器,你都不需要明确地包含stl(标准模板库)。这是否意味着我可以依靠stl成为"始终可用"?
我的意思是,如果我想使用std::cout
,我只需要包含stl的iostream
部分:
#include <iostream>
...并且首先不需要像#include <std>
那样继续做类似的事情:
std::cout << "Hello world!" << std::endl;
此外:我可以依靠stl的一致性吗? stl的每个函数/方法是否总是以相同的方式运行?或者C ++版本,操作系统或编译器之间是否有任何变化?
我问这个问题,因为当你不知道某些陷阱时,其他图书馆有时会非常痛苦。例如,Eigen(对于线性代数的东西)对我来说真的很难实现,我注意到一些版本之间改变行为...
答案 0 :(得分:9)
是的,尽管允许仅提供子集的独立实现有特殊限制,但C ++标准库必须随每个C ++编译器一起提供,因为它是语言规范的一部分。 (最初作为C ++扩展的内容最初被称为标准模板库,但现在更好的术语是C ++标准库。)
C ++标准库指定得非常好 - 您总是需要包含各种头文件以引入标准库组件。您需要的标头不会从编译器更改为编译器。在这方面,它与机器无关。
随着标准的发展,理念是尽量减少兼容性中断,但有一些:例如:在C ++ 11中重新定义auto关键字,以及从该标准开始弃用std :: auto_ptr。
大多数组件确实位于保留命名空间std中 - 某些功能不是出于传统原因。最后,最好使用std :: explicit,而不是通过使用
将整个std命名空间引入全局std命名空间。using namespace std;
否则,您的代码容易受到命名空间歧义的影响。
答案 1 :(得分:4)
几乎所有C ++编译器都将附带标准C ++库。这些被称为&#34;托管实现。&#34;这个库定义得很好,虽然它确实在增长,但它很少会以破坏旧代码的方式发生变化。标准委员会的主要目标是保持向后兼容性。
该标准还允许&#34;独立实施,&#34;它带有一个非常精简的库,完全在头文件中实现。在为嵌入式系统开发代码时可能会遇到这种情况,特别是如果该系统没有底层操作系统。这些很少见,但确实存在。 (第7.6.1.13节谈论独立实施。)
答案 2 :(得分:3)
这是否意味着我可以依赖stl“始终可用”?
是的,标准库是C ++语言的一部分。因此,保证它将“始终可用”任何C ++编译器。
我可以依赖STL的一致性吗?
是的,当然。 C ++标准库是为我们所遭受的精彩思想的精华,为了我们不要时不时地重新发明轮子或者必须信任第三方库,最终可能会让你陷入困境。它尽可能地包含在内并且尽可能通用。
STL的每个函数/方法是否总是以相同的方式运行? 或者C ++版本,操作系统或编译器之间是否有任何变化?
C++ standard中描述了C ++标准库。因此,保证在C ++标准兼容编译器中,C ++标准库的功能获得相同的行为,即符合标准的行为。 C ++版本之间存在变化(例如,附加功能),但保证了向后兼容性。也就是说,用C ++ 98编写的代码仍然可以与支持C ++ 17的现代C ++编译器兼容(除少数例外)。
我问这个问题,因为当你不知道某些陷阱时,其他图书馆有时会非常痛苦。
通常,我们鼓励您尽可能使用C ++标准库,并避免使用与标准库提供相同功能的第三方库。这是由于其中一些原因造成的:
答案 3 :(得分:0)
所有C ++编译器都附带了一些可用的标准模板库版本。不同的编译器将支持不同版本的标准(即C ++ 98,C ++ 11,C ++ 14,C ++ 17),但是您可以预期所有这些版本都将附带vector
,{iostream
等标题。 {1}}等等,那就是你的全部!标准化过程是许多编译器供应商努力定义这些头中的功能并使其以标准方式提供给程序员的,也就是说,在每个平台都可以使用兼容的编译器。< / p>
答案 4 :(得分:0)
标准模板库是标准的一部分。因此,只要您具有标准分配器的实现(更多内容),它应该适用于所有符合标准的编译器。
标准模板库经过特殊处理&#34;&#34;在历史原因的文献中,C ++诞生了#34; 1983年,但第一个标准直到1998年才发布。
STL第一次实施也是在1983年,但对于ADA语言。第一个到c ++的端口直到1992年才由HP完成。
1993年,它被提议纳入ANSI标准,经过一些修改后于1994年被接受。
这使得stdlib上的STL成为原始STL的一个分支。
在早期,有些人仅使用STL来引用原始的HP库,后来由SGI维护,而其他人使用STL来引用stdlib上的容器子集。
STL外部行为应该是相同的&#34;对于所有实现,但内存打包可能因实现而异。
今天原来的C ++ STL不再被维护了,并且在谈论 STL应该引用stdlib容器,尽管标准本身并没有使用STL的首字母缩略词。
最后,stdlib容器使用标准allocator进行内存管理。在Linux GCC上由libstdc ++提供,在嵌入式系统上,您需要自己为标准分配器提供实现,因为您没有操作系统为您管理内存。
这也适用于依赖系统调用的其他函数。 std::cout
除非您为其定义实施,否则无法在裸机系统上使用。