程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 我的STL學習之路,STL學習之路

我的STL學習之路,STL學習之路

編輯:C++入門知識

我的STL學習之路,STL學習之路


  說起STL(標准模板庫),相信了解C++的都不會陌生吧^_^。LZ是從大三開始學習C++(ps:不是科班出身),並慢慢接觸使用STL的,在學校中使用STL比較多的情況是寫數據結構代碼,使用STL實現數據結構代碼(我的數據結構源碼),使我們專注於考慮算法思想,不拘泥於底層代碼實現。

  這裡LZ不講STL的具體知識,只討論關於STL的學習和使用問題!結合LZ的學習過程,LZ覺得C++的學習(當然,這其中包括的STL)大致路線如下:

  學習C++(包括STL),當然少不了閱讀書籍,尤其是經典書籍,參考上面的學習路線,對應的推薦書籍如下:

  1/2/3:《C++ Primer》 對C++基本概念、技術、以及現代C++編程風格進行了全面而且權威的闡述,是C++初學者的最佳指南,聖經級書籍。

  4/5:《STL源碼剖析》 深入分析STL源代碼(SGI版本),幫助你加深對STL的理解,以後使用STL就放心大膽了。

  6:《深度探索C++對象模型》 專注於C++面向對象程序設計的底層機制,包括結構式語意、臨時性對象的生成、封裝、繼承,以及虛擬—虛擬函數和虛擬繼承,幫助你理解程序的底層實現,以便寫出更高效的代碼。

  當然,在學習的過程中,可以同時閱讀《Effective C++》,幫助你寫出更加健壯的C++代碼。學習C++以及STL閱讀這幾本書,其他的C++書籍大可不必再看了。

1、STL是什麼

  STL(Standard Template Library 標准模板庫)是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發出來的。從根本上說,STL是一些“容器”的集合,這些“容器”有list,vector,set,map等,STL也是算法和其他一些組件的集合。這裡的“容器”和算法的集合指的是世界上很多聰明人很多年的傑作。STL的目的是標准化組件,這樣就不用重新開發,可以使用現成的組件,STL現在是C++的一部分。

  STL提供了六大組件,並且組件彼此間可以組合套用:

  • 容器(Containers):各種數據結構,如:vector、list、deque、set、map。用來存放數據。從實現的角度來看,STL容器是一種class template。
  • 算法(algorithms):各種常用算法,如:sort、search、copy、erase。從實現的角度來看,STL算法是一種 function template。
  • 迭代器(iterators):容器與算法之間的膠合劑,是所謂的“泛型指針”。共有五種類型,以及其他衍生變化。從實現的角度來看,迭代器是一種將 operator*、operator->、operator++、operator- - 等指針相關操作進行重載的class template。所有STL容器都有自己專屬的迭代器,只有容器本身才知道如何遍歷自己的元素。原生指針(native pointer)也是一種迭代器。
  • 仿函數(functors):行為類似函數,可作為算法的某種策略(policy)。從實現的角度來看,仿函數是一種重載了operator()的class或class template。一般的函數指針也可視為狹義的仿函數。
  • 配接器(adapters):一種用來修飾容器、仿函數、迭代器接口的東西。例如:STL提供的queue 和 stack,雖然看似容器,但其實只能算是一種容器配接器,因為它們的底部完全借助deque,所有操作都由底層的deque供應。改變 functors接口者,稱為function adapter;改變 container 接口者,稱為container adapter;改變iterator接口者,稱為iterator adapter。
  • 配置器(allocators):負責空間配置與管理。從實現的角度來看,配置器是一個實現了動態空間配置、空間管理、空間釋放的class template。

STL六大組件將的交互關系

 

 2、公司實際項目中到底該不該用STL呢

  網上關於STL的討論還是很多的,比如為何某些公司不允許使用STL?STL到底該不該用?...這裡結合LZ的實際工作經歷,來談談STL的使用問題,LZ目前在某華做安防平台開發,項目中就使用了STL,不過項目中使用的大都是STL中容器、迭代器部分,像算法等其他部分很少使用。LZ覺得,在實際項目中使不使用STL,主要看項目的實際需求,根據具體使用場景來取捨。該安防平台主要負責與設備通信、存儲設備發送上來的圖片和視頻、與web端交互等,由於平台接入設備有限,所以不會有很大的並發量,使用STL完全滿足要求了。

  使用STL,避免了底層數據的封裝處理,更專注於業務邏輯實現;但是使用STL可能會產生代碼膨脹問題、內存使用效率問題、類型隱式轉換問題,這些問題在項目中數據量較大或者項目並發要求比較高就會成為性能瓶頸的,注意,STL容器不是線程安全的,在多線程中使用需要自己實現加鎖操作。

3、繼續學習C++

  學習C++,除了經典書籍外還有另外一個比較重要的資源,那就是開源代碼。閱讀開源代碼,不進可以了解源碼規范,還可以深入了解該系統是如何實現的,加深對技術的理解。閱讀源碼的同時,自己可以嘗試造輪子,關於C++,有幾個比較經典的源碼:

  • leveldb:Google出品,遵循Google C++編碼規范。作者是Jeff Dean大神。
  • libevent:是一個開源的事件驅動庫,基於epoll,kqueue等OS提供的基礎設施。
  • TeamTalk:蘑菇街開源的即時通信軟件,有PC、Android、Ios版本,其中Server端是C++實現。
  • ...

 

參考資料

  1、為何某些公司不允許使用 C++ STL?

  2、《STL源碼剖析》第一章節部分

  3、C++實現的數據結構源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved