、STL的版本

C++语言在1994年已经趋于成熟,但第一个官方大版本直到1998年才正式发布。这其中的一个关键原因是STL(标准模板库)的出现。原始STL版本由Alexander Stepanov和Meng Lee在惠普实验室(HP版本)开发,本着开源精神,允许自由使用和修改。但为了将STL纳入C++标准库,并确保其稳定性,C++标准委员会花费了时间进行整合和改进,因此发布推迟了4年,最终在1998年将STL作为C++标准库的核心部分。

随着STL的普及,多个衍生版本应运而生,并被不同编译器采用:

  • P.J.版本由P.J. Plauger开发,继承自HP版本,被Windows Visual C++采用,但因其封闭性和可读性较低,主要局限于Windows平台。
  • RW版本由Rouge Wage公司开发,同样源于HP版本,被C++ Builder采用,但也不可公开修改。C++ Builder这类编译器在与微软Visual Studio的竞争中逐渐销声匿迹,反映了当时编译器市场的变迁。
  • SGI版本由Silicon Graphics公司开发,同样基于HP版本,被GCC(GNU编译器集合)采用,尤其在Linux系统中广泛使用。GCC通常被视为G++的统称,而G++是GCC中用于C++编译的组件。SGI版本的可移植性和可读性高,成为学习STL源代码的重要参考。

总之,STL的发展不仅影响了C++标准的发布时机,也通过不同版本的集成推动了编译器的演化,其中GCC(通过SGI版本)在开源领域占据了重要地位。

三、STL的六大组件

STL在实践的过程中被分为六大组件(类别)

在这里插入图片描述

在这里插入图片描述

四、为什么学习string类

4.1 C语言中的字符串

C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问

在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数

五、标准库中的string类

5.1 string类的历史地位与STL关系

在使用string类时,必须包含#include头文件以及using namespace std;

在这里插入图片描述

在这里插入图片描述

可以看到string不在容器之中,严格来说string不在STL库中,它在C++相关的标准库部分

在这里插入图片描述

在这里插入图片描述

有兄弟就说不对呀?前面不是把string归类到STL容器里了吗?

这其中有一些历史的发展原因,因为string产生的比STL早,C++标准委员会创建的string类就在标准库中,其后STL这些容器的设计也参考了string的设计,这里string的归类是历史的原因。string在后续的修改也参考了STL的设计,但是string在使用的功能和设计的风格来说,它和容器几乎一样,所以后面把string归到容器

5.2 basic_string模板家族

C++标准库中的字符串类型std::string实际上是通过一个名为basic_string的类模板进行类型定义得到的。具体来说,std::string是basic_string< char >的别名,专门用于处理单字节字符。除了常用的string类型,C++还提供了basic_string模板的其他特化版本,以支持不同字符宽度和编码需求。例如,std::wstring用于宽字符(通常为wchar_t,在Windows平台中一般为2字节,在Linux平台中通常为4字节),以及C++11标准引入的std::u16string和std::u32string,分别用于处理UTF-16和UTF-32编码的字符,对应的字符类型为char16_t(2字节)和char32_t(4字节)

更多推荐