C++為什麼要引入STL?

2020-07-16 10:05:21
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++ 程式設計師提供了大量的可延伸的程式框架,高度實現了程式碼的可重用性,並且它是內建的,不需要額外安裝,使用非常方便。