C++STL概覽

轉自:http://www.cnblogs.com/ggjucheng/archive/2012/01/03/2310884.htmlhtml

轉自:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html通過兩篇博文融合整理獲得ios

引言

C++ STL能夠分爲標準容器,算法和函數對象,迭代器和分配器程序員

利用C++標準程序庫,能夠大量減小咱們的代碼,提升代碼的穩定性和健壯性。算法

標準容器

C++標準容器分爲序列容器和關聯容器。編程

一、對於序列容器,C++提供的基本序列有設計模式

vector 支持隨機訪問,不適合作插入和刪除操做頻繁的場景數組

list 雙向鏈表,適合作元素的插入和刪除,不是隨機訪問數據結構

deque 也是一個雙端序列,可是通過優化,其雙端操做效率相似list,隨即訪問效率接近vector。ide

從它們出發,經過定義適當的藉口,生成了函數

stack 默認用deque實現

queue 默認是deque實現

priority_queue 默認是vector保存元素,實現最多是heap

二、對於關聯容器,C++提供的有:

map 映射

mulitimap 多重映射,相比map,容許重複的key

set 被看作是一個map,其中的值是可有可無的

mulitiset 相比set,容許重複的key

bitset 位集合

hash_map 散列映射,經過實現一個散列函數,將容器實現爲一個散列表,以減小查找元素所須要的時間

 

標準容器具體用法能夠參考C++在線手冊STL容器:http://www.cplusplus.com/reference/stl/

算法和函數對象

容器自己之因此有用,是由於容器提供了一些基本操做,如肯定大小,迭代,複製,排序,查找等。標準庫提供了許多算法,服務於容器用戶的最廣泛和最基本的須要。標準庫算法不過就是60個,每一個算法都描述爲一個模板函數或一組模板函數,例如最經常使用的排序算法:sort,能以很好的平均效率排序,建議排序都用sort替換C語言的qsort,sort能夠更好結合容器。標準庫算法和函數對象的教程能夠參考C++之父的C++程序設計語言的算法和函數對象,這一章內容能夠教你如何使用標準庫算法和函數對象。

算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。

  • <algorithm>是全部STL頭文件中最大的一個(儘管它很好理解),它是由一大堆模版函數組成的,能夠認爲每一個函數在很大程度上都是獨立的,其中經常使用到的功能範圍涉及到比較、交換、查找、遍歷操做、複製、修改、移除、反轉、排序、合併等等。
  • <numeric>體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操做。
  • <functional>中則定義了一些模板類,用以聲明函數對象

 

標準庫算法具體用法參考C++在線手冊STL算法:http://www.cplusplus.com/reference/algorithm/

 

迭代器和分配器

一、迭代器是鏈接容器和算法的紐帶,讓寫算法的人沒必要關心各類數據結構的具體細節,而分配器提供了一個映射,將低級的字節形式的數據模型映射到高級的對象模型。迭代器是每一個程序員都須要關心的概念之一,可是分配器僅僅是一個支持機制,標準庫已經提供了默認的分配器,不多有程序員須要去寫新的分配器。迭代器在接觸STL容器就會了解了,通常迭代器分爲正向迭代器,反向迭代器,插入迭代器,帶檢查的迭代器。

幾乎STL提供的全部算法都是經過迭代器存取元素序列進行工做的,每個容器都定義了其自己所專有的迭代器,用以存取容器中的元素。

迭代器部分主要由頭文件<utility>,<iterator>和<memory>組成。

  • <utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,
  • <iterator>中提供了迭代器使用的許多方法,而對於<memory>的描述則十分的困難,它以不一樣尋常的方式爲容器中的元素分配存儲空間,同時也爲某些算法執行期間產生的臨時對象提供機制,<memory>中的主要部分是模板類allocator,它負責產生全部容器中的默認分配器。

二、分配器提供了一套分配和釋放存儲的標準方式,標準庫提供了一個標準分配器,在<memory>裏的標準allocator模板用operator new()分配存儲,全部的標準容器在默認狀況下使用它,固然你也能夠本身實現一個分配器,容器的實現須要一次次的allocate()或者deallocate()對象,意味着new的大量調用,你能夠採用一個固定大小存儲塊的存儲池,能夠比常規的更通用的operator new()的效率高一些。

總結

C++學習的50條忠告:

1.把C++當成一門新的語言學習;

2.看《Thinking In C++》,不要看《C++變成死相》;

3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要由於他們很難而咱們本身是初學者因此就不看;

4.不要被VC、BCB、BC、MC、TC等詞彙所迷惑——他們都是集成開發環境,而咱們要學的是一門語言;

5.不要放過任何一個看上去很簡單的小編程問題——他們每每並不那麼簡單,或者能夠引申出不少知識點;

6.會用Visual C++,並不說明你會C++;

7.學class並不難,template、STL、generic programming也不過如此——難的是長期堅持實踐和竭盡全力的博覽羣書;

8.若是不是天才的話,想學編程就不要想玩遊戲——你覺得你作到了,其實你的C++水平並無和你通關的能力一塊兒變高——其實能夠時刻記住:學C++是爲了編遊戲的;

9.看Visual C++的書,是學不了C++語言的;  

16.把時髦的技術掛在嘴邊,還不如把過期的技術記在內心;

18.學習編程最好的方法之一就是閱讀源代碼;

19.在任什麼時候刻都不要認爲本身手中的書已經足夠了;

20.請閱讀《The Standard C++ Bible》(中文版:標準C++寶典),掌握C++標準;

21.看得懂的書,請仔細看;看不懂的書,請硬着頭皮看;

22.別期望看第一遍書就能記住和掌握什麼——請看第二遍、第三遍;

23.請看《Effective C++》和《More Effective C++》以及《Exceptional C++》;

24.不要停留在集成開發環境的搖籃上,要學會控制集成開發環境,還要學會用命令行方式處理程序;

25.和別人一塊兒討論有意義的C++知識點,而不是爭吵XX行不行或者YY與ZZ哪一個好;

26.請看《程序設計實踐》,並嚴格的按照其要求去作;

27.不要由於C和C++中有一些語法和關鍵字看上去相同,就認爲它們的意義和做用徹底同樣;

28.C++毫不是所謂的C的「擴充」——若是C++一開始就起名叫Z語言,你必定不會把C和Z語言聯繫得那麼緊密;

29.請不要認爲學過XX語言再改學C++會有什麼問題——你只不過又在學一門全新的語言而已;

30.讀完了《Inside The C++ Object Model》之後再來認定本身是否是已經學會了C++;

31.學習編程的祕訣是:編程,編程,再編程;

32.請留意下列書籍:《C++面向對象高效編程(C++ Effective Object-Oriented Software Construction)》《面向對象軟件構造(Object-Oriented Software Construction)》《設計模式(Design Patterns)》《The Art of Computer Programming》; 

34.請把書上的程序例子親手輸入到電腦上實踐,即便配套光盤中有源代碼;

35.把在書中看到的有意義的例子擴充;

36.請重視C++中的異常處理技術,並將其切實的運用到本身的程序中;

37.常常回顧本身之前寫過的程序,並嘗試重寫,把本身學到的新知識運用進去;

38.不要漏掉書中任何一個練習題——請所有作完並記錄下解題思路;

39.C++語言和C++的集成開發環境要同時學習和掌握;

40.既然決定了學C++,就請堅持學下去,由於學習程序設計語言的目的是掌握程序設計技術,而程序設計技術是跨語言的;

41.就讓C++語言的各類平臺和開發環境去激烈的競爭吧,咱們要以學習C++語言自己爲主;

42.當你寫C++程序寫到一半卻發現本身用的方法很拙劣時,請不要立刻停手;請儘快將餘下的部分粗略的完成以保證這個設計的完整性,而後分析本身的錯誤並從新設計和編寫(參見43);

43.別心急,設計C++的class確實不容易;本身程序中的class和本身的class設計水平是在不斷的編程實踐中完善和發展的;

44.決不要由於程序「很小」就不遵循某些你不熟練的規則——好習慣是培養出來的,而不是一次記住的;

45.每學到一個C++難點的時候,嘗試着對別人講解這個知識點並讓他理解——你能講清楚才說明你真的理解了;

46.記錄下在和別人交流時發現的本身忽視或不理解的知識點;

47.請不斷的對本身寫的程序提出更高的要求,哪怕你的程序版本號會變成Version 100.XX;

48.保存好你寫過的全部的程序——那是你最好的積累之一;

49.請不要作浮躁的人;

50.請熱愛C++!

學會應用能夠學習理論:考慮看下C++之父的C++程序設計語言的標準庫,也能夠看更厚的書:C++標準程序庫。

最後,你在工做和編程中,都須要C++容器和算法的手冊查閱,這些能夠參考上面的網址:

C++在線手冊STL容器:http://www.cplusplus.com/reference/stl/

C++在線手冊STL算法:http://www.cplusplus.com/reference/algorithm/

這裏面詳細介紹了每一個容器和算法的每一個函數,幾乎95%都有例子,是很好的參考資料

附件

C++頭文件一覽 
C、傳統 C++

#include <assert.h>    設定插入點
#include <ctype.h>    字符處理
#include <errno.h>     定義錯誤碼
#include <float.h>    浮點數處理
#include <fstream.h>   文件輸入/輸出
#include <iomanip.h>    參數化輸入/輸出
#include <iostream.h>   數據流輸入/輸出
#include <limits.h>    定義各類數據類型最值常量
#include <locale.h>    定義本地化函數
#include <math.h>     定義數學函數
#include <stdio.h>    定義輸入/輸出函數
#include <stdlib.h>    定義雜項函數及內存分配函數
#include <string.h>    字符串處理
#include <strstrea.h>   基於數組的輸入/輸出
#include <time.h>     定義關於時間的函數
#include <wchar.h>     寬字符處理及輸入/輸出
#include <wctype.h>    寬字符分類

標準 C++ 

#include <algorithm>     通用算法
#include <bitset>      位集容器
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>     複數類
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>      雙端隊列容器
#include <exception>    異常處理類
#include <fstream>
#include <functional>    定義運算函數(代替運算符)
#include <limits>
#include <list>       線性列表容器
#include <map>       映射容器
#include <iomanip>
#include <iOS>      基本輸入/輸出支持
#include <iosfwd>    輸入/輸出系統使用的前置聲明
#include <iostream>
#include <istream>     基本輸入流
#include <ostream>     基本輸出流
#include <queue>       隊列容器
#include <set>       集合容器
#include <sstream>     基於字符串的流
#include <stack>      堆棧容器    
#include <stdexcept>    標準異常類
#include <streambuf>   底層輸入/輸出支持
#include <string>     字符串類
#include <utility>     通用模板類
#include <vector>     動態數組容器
#include <cwchar>
#include <cwctype>

C99 增長

#include <complex.h>  複數處理#include <fenv.h>    浮點環境#include <inttypes.h>  整數格式轉換#include <stdbool.h>   布爾環境#include <stdint.h>   整型環境#include <tgmath.h>  通用類型數學宏

相關文章
相關標籤/搜索