C++为什么要引入STL?

C++ 标准程序库发展至今,几乎所有内容都被设计为了模板的形式,STL 已经成为 C++ 程序库的重要组成部分。可以这么说,如果 C++ 不支持 STL 标准模板库,就无法使用程序库。那么,C++ 为什么要引入 STL 呢?

在大多数人看来,计算机既神秘有能干,但在程序员的眼中,计算机又蠢又笨,唯一的优点就是运算速度比人快,不给指令什么都干不了,就是给指令,计算机也不能灵活运用。

比如说,在 C++ 中,同样一个加法,不同的数据类型,要给出不同的运行代码:
#include<iostream>
using namespace std;

//处理整形之间的加法
int addInt(int m, int n) {
    return m + n;
}
//处理浮点类型值之间的加法
double addDouble(double i, double j) {
    return i + j;
}
//......
int main()
{
    cout << addInt(1, 2) << endl << addDouble(1.2, 2.1);
    return 0;
}
运行结果为:

3
3.3

像这样,对于每一种数据类型,我们都必须给计算机设计一个单独的函数,实在太繁琐了。由此可以感受到,计算机并不具备人类的基本思维,处理问题不灵活。

为了让计算机不断接近人类的认知能力,科学家们想了很多办法,比如使用面向对象开发技术,通过类的封装和函数重载,可以部分解决上面的问题:
#include<iostream>
using namespace std;

class calc {
public:
    //处理整形之间的加法
    int add(int m, int n) {
        return m + n;
    }
    //处理浮点类型值之间的加法
    double add(double i, double j) {
        return i + j;
    }
    //......
};

int main()
{
    calc a;
    cout << a.add(1, 2) << endl << a.add(1.2, 2.1);
    return 0;
}
运行结果为:

3
3.3

有关 C++ 函数重载,可阅读《C++函数重载详解》一节。

创建这样的类之后,当通过类对象调用 add 方法时,就无需考虑参数的具体数据类型了。但从某种程序上来说,这也仅是让计算机聪明了一点点。

为了让程序更加智能、人性化,经过科学家们持续的努力,C++ 引入了模板这个功能。模板可以认为是针对一个或多个尚未明确的类型而编写的一个个函数,是 C++ 的一个新特性。

通过引入模板,C++ 引申出了泛型编程技术。简单的理解泛型编程,即使用该技术编写的代码,可以支持多种数据类型。也就是说,通过泛型编程,能编写出可重复利用的程序代码,并且其运行效率和针对某特定数据类型而设计的代码相同。由此可见,C++ 很需要泛型这种新的编程模式,可以减轻编程的工作量,增强代码的重用性。

有关泛型及泛型编程,读者可阅读《泛型是什么,C++泛型编程又是什么?》一文做详细了解。

在 C++ 支持模板功能,引入了泛型编程思想的基础上,C++ 程序员们想编写出很多通用的针对不同数据类型的算法,其中 STL 脱颖而出成为 C++ 标准,并被引入 C++ 标准程序库。

STL 是一个具有高度可用性、高效的模板库,该库包含了诸多在计算机科学领域中常用的基础数据结构和算法,掌握了 STL 标准,很多功能就无需自己费心费力的去实现了(不用重复的造轮子),直接拿来用即可。

总的来说,STL 模板库是 C++ 标准程序库的重要组成部分,为 C++ 程序员提供了大量的可扩展的程序框架,高度实现了代码的可重用性,并且它是内置的,不需要额外安装,使用非常方便。