日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

什么是STL

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是STL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我想告訴我什么是STL,也想告訴你什么是STL。

  • 什么是大名鼎鼎的STL
    • L
    • T
    • S
    • 小結
  • STL作者
  • STL組成
    • 組成圖示
    • STL如何工作
  • 為什么使用STL
    • 高可重用性
    • 高性能
    • 高移植性
    • 跨平臺
  • STL分類標準

什么是大名鼎鼎的STL

開始說明STL之前先來告訴大家一句話,如果你通過我的博客看懂了STL,或者有所收獲必定會對于這句話有著更加深刻的哲學理解。
這句話就是:如果說我看得遠,那是因為我站在巨人的肩膀上。

因為在使用C++開發業務邏輯代碼的過程中,必然會使用到STL,所以STL對于C++程序員工作來說非常重要。當然如果你要面試C++相關的崗位,我也希望能幫你更加深刻的理解STL,讓你在面試中如果面試官問到STL的內容時,你能夠有自己的理解和思路。

L

好了進入正題,接下來我們說明大名鼎鼎的STL。
首先,什么是STL呢?
STL = Standard Template Library。
Library 表示STL是一個函數庫。

函數庫的目的又是什么呢?函數庫又是干什么用的呢?
函數庫存在的目的就是避免重復造輪子。
我們學習過C語言和C++語言必定知道一套函數庫用來解決一類問題,函數庫里面整合了解決該類問題的大量函數。我們舉例子進行說明:
就像大家以前用的函數sin/random等來自數學庫。
printf/fopen/fread/fwrite等來自 io 庫。
strcpy/strcmp/strcat 等來自字符串庫。

每一種函數庫都解決了一類問題。比如數學庫,解決通用數據運算問題,io 庫解決了輸入輸出問題, 字符串庫解決了字符串的生成,復制,拼接等問題。
所以說函數庫的存在就是避免重復造輪子,提高了開發效率。

STL 作為一個庫,解決了哪些問題呢?
STL解決的就是很多讀者都很頭疼的問題:數據結構與算法
從此,數據結構和算法,不再是王謝堂前燕,經過 STL 后,己飛入尋常百姓家了。

T

那么接下來的 T 也就是 Template
Template 中文是模板的意思,模板解決了什么問題呢?
核心的一句話就是:模板解決了泛型編程的問題。
模板抹平了數據類型的差異,我們說STL中的算法,算法是解決問題的步驟,那么就不關心操作的是什么類型的數據,而是關系如何操作數據。
例如:排序算法,我們并不關心對于什么數據進行排序,更加關心的是排序的思想,如何來搬運數據。

C++引入Template 后,泛型編程才算是落到了實處,其實也是解決避免重復造輪子,提高開發效率的問題。

S

那么最后就是Standard 標準。
為什么說是標準呢?
STL 己經被C++委員會納入 C++標準的一部分。以前說 C++有三大特征,**封裝,繼承,多態。**現在至少要說,C++四大特征,封裝,繼承,多態和 模板STL。
但凡支持C++的平臺都支持STL。

小結

STL 是由 C++模板編寫的一套己納入 C++標準的類庫,該庫解決了通用數據結構與算法的問題。

STL作者

STL 它是由 Alexander Stepanov、Meng LeeDavid R Musser 在惠普實驗室工作時所開發出來的。亞歷山大·斯特潘諾夫(AlexanderStepanov),STL(標準模板庫)之父,并因此而榮獲第一屆 Dr. Dobb’s 程序設計杰出獎, 現在是 Adobe 公司首席科學家。他曾是康柏電腦公司的副總裁和首席科學家,AT&T 實驗室副總裁和首席架構師,SGI 服務和超級計算機業務首席技術官。

上面的作者就是簡單介紹一下,讀者可以了解一下,既然要學習STL,就要了解STL的發明者。
接下來送給所有讀者STL作者說過的一句話:
程序基于精確的數學——STL 之父 Alex Stepanov。

STL組成

組成圖示

STL 主要由空間配置器 allocator,容器 container,算法 algorithm,迭代器iterator 和仿函數 functor組成。

適配器是容器的適配器、仿函數的適配器和迭代器的適配器。
STL里面核心的是容器和算法。

STL的設計違背OO的思想:
容器用來存放數據,算法用來操作數據,也就是行為。
OO的思想是面向對象:數據和行為統一。
但是上面的圖示中數據和方法是分開的,所以我們說設計上有違背OO的思想。從宏觀上來說,STL是一個整體,那就是OO的思想,但是如果從內部來看就有點違背OO的思想。

通過迭代器連接算法和容器。
仿函數起到了算法決策的作用,也就是對于容器中的數據進行操作的條件。

STL如何工作

接下來我們看STL的幾大部件如何來進行工作?
代碼演示:

#include <iostream> #include <vector>//包含頭文件 #include <algorithm> using namespace std;class Cpmpare { public:bool operator()(int i, int j) //仿函數{return i > j;} };class Mycompare { public:bool operator()(int & v) //仿函數{return v > 5;} };int main() {int arr[10] = { 1,3,5,7,9,2,4,6,8,10 };vector<int, allocator<int>> vi;//前面的int 表示容器中存放數據成員的類型//allocator<int> 是模板類//類模板 + int 生成模板類 allocator<int>(代表一種類型 等價于 int/char)//allocator<int> 模板類 是空間配置器/內存申請器,用于申請容器中數據的內存空間 //vector<int, allocator<int>> vi vector模板類生成 vi 對象vi.assign(arr, arr + 10); //assign:賦值//使用時沒有聲明vi的大小,也不用關心vi能夠存放多少數據//迭代器功能:連接容器和算法vector<int, allocator<int>>::iterator itr; //迭代器for (itr = vi.begin(); itr != vi.end(); ++itr) //遍歷打印數據{cout << *itr << " ";}cout << endl;//itr的行為和指針相同。//itr是一個智能指針(自動管理內存)。//智能指針是一個對象,可以用指針的形式使用。//itr的本質是對于底層指針的封裝,讓對象具備了指針的特性。int* p = nullptr;for (p = arr; p != arr + 10; p++) //打印數據{cout << *p << " ";}cout << endl;//排序算法 需要包含#include <algorithm>sort(vi.begin(), vi.end(), Cpmpare()); //第三個參數只需要傳遞可調用對象即可,可調用對象包括:函數指針,lambda,仿函數。//正規的用法第三個參數傳入的是仿函數。//仿函數在STL里面應用廣泛。//仿函數的本質是通過對象調用,不能通過類型調用。for (auto & i : vi)//C++11打印方法{cout << i << endl;}//統計大于5的數據有幾個int count = count_if(vi.begin(), vi.end(), Mycompare());cout << "count = " << count << endl;return 0; }

運行結果:

圖解分析(代碼):

圖解分析(容器):

上面通過不同的顏色框圖對于STL的結構對應的代碼進行對應。
容器用來存放數據,allacotor < int >用來在底層開辟內存空間。
算法通過迭代器完成對于容器數據的計算操作。
仿函數起到一個決策的作用>5? >3? >2?。
仿函數起到對于容器中的數據進行操作的條件作用。

關于bind和function我們只是在這里簡單提出,如果刨析會比較麻煩,但是最核心的心法給大家說明,想要詳細了解的讀者可以自行搜索或者看我對應博客,因為在這里不影響STL的說明,所以不多贅述。
bind:實現了可調用對象 + 參數,綁定為一個新的可調用對象。
bind 解決了 對象 + 參數的問題。

funcation:起到了統一接口的功能,具有取代多態的趨勢。

為什么使用STL

高可重用性

STL 中幾乎所有的代碼都采用了模板類和模板函數的方式實現,這相比于傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。

高性能

如 map 可以高效地從十萬條記錄里面查找出指定的記錄,因為 map 是采用紅黑樹的變體實現的。 (紅黑樹是平衡二叉樹的一種)
STL里面很多都是數學家寫的,所以性能上不存在問題。

高移植性

如在項目 A 上用 STL 編寫的模塊,可以直接移植到項目 B 上。

跨平臺

如用 windows 的 Visual Studio 編寫的代碼可以在 Mac OS 的 XCode 上直接編譯。

STL分類標準

總結

以上是生活随笔為你收集整理的什么是STL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。