轉載自:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html
先MARK爲敬html
學無止境!!!ios
第一部分:(參考百度百科)算法
1、STL簡介編程
STL(Standard Template Library,標準模板庫)是惠普實驗室開發的一系列軟件的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工做時所開發出來windows
的。如今雖然說它主要出如今C++中,但在被引入C++以前該技術就已經存在了很長的一段時間。設計模式
STL的代碼從廣義上講分爲三類:algorithm(算法)、container(容器)和iterator(迭代器),幾乎全部的代碼都採用了模板類和模版函數的方式,這相比於傳統的由函數和類數組
組成的庫來講提供了更好的代碼重用機會。在C++標準中,STL被組織爲下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、數據結構
<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。 框架
2、算法數據結構和算法
你們都能取得的一個共識是函數庫對數據類型的選擇對其可重用性起着相當重要的做用。舉例來講,一個求方根的函數,在使用浮點數做爲其參數類型的狀況下的可重用性確定比
使用整型做爲它的參數類性要高。而C++經過模板的機制容許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了至關多的有用
算法。它是在一個有效的框架中完成這些算法的——你能夠將全部的類型劃分爲少數的幾類,而後就能夠在模版的參數中使用一種類型替換掉同一種類中的其餘類型。
STL提供了大約100個實現算法的模版函數,好比算法for_each將爲指定序列中的每個元素調用指定的函數,stable_sort以你所指定的規則對序列進行穩定性排序等等。這樣一來
,只要咱們熟悉了STL以後,許多代碼能夠被大大的化簡,只須要經過調用一兩個算法模板,就能夠完成所須要的功能並大大地提高效率。
算法部分主要由頭文件<algorithm>,<numeric>和<functional>組成。
<algorithm>是全部STL頭文件中最大的一個(儘管它很好理解),它是由一大堆模版函數組成的,能夠認爲每一個函數在很大程度上都是獨立的,其中經常使用到的功能範圍涉及到比較、交換、查找、遍歷操做、複製、修改、移除、反轉、排序、合併等等。
<numeric>體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操做。
<functional>中則定義了一些模板類,用以聲明函數對象。
3、容器
在實際的開發過程當中,數據結構自己的重要性不會遜於操做於數據結構的算法的重要性,當程序中存在着對時間要求很高的部分時,數據結構的選擇就顯得更加劇要。
經典的數據結構數量有限,可是咱們經常重複着一些爲了實現向量、鏈表等結構而編寫的代碼,這些代碼都十分類似,只是爲了適應不一樣數據的變化而在細節上有所出入。STL容器
就爲咱們提供了這樣的方便,它容許咱們重複利用已有的實現構造本身的特定類型下的數據結構,經過設置一些模版類,STL容器對最經常使用的數據結構提供了支持,這些模板的參數
容許咱們指定容器中元素的數據類型,能夠將咱們許多重複而乏味的工做簡化。
容器部分主要由頭文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>組成。對於經常使用的一些容器和容器適配器(能夠看做由其它容器實現的容器),能夠經過下表總結一下它們和相應頭文件的對應關係。
向量(vector) 連續存儲的元素<vector>
列表(list) 由節點組成的雙向鏈表,每一個結點包含着一個元素<list>
雙隊列(deque) 連續存儲的指向不一樣元素的指針所組成的數組<deque>
集合(set) 由節點組成的紅黑樹,每一個節點都包含着一個元素,節點之間以某種做用於元素對的謂詞排列,沒有兩個不一樣的元素可以擁有相同的次序 <set>
多重集合(multiset) 容許存在兩個次序相等的元素的集合 <set>
棧(stack) 後進先出的值的排列 <stack>
隊列(queue) 先進先出的執的排列 <queue>
優先隊列(priority_queue) 元素的次序是由做用於所存儲的值對上的某種謂詞決定的的一種隊列 <queue>
映射(map) 由{鍵,值}對組成的集合,以某種做用於鍵對上的謂詞排列 <map>
多重映射(multimap) 容許鍵對有相等的次序的映射 <map>
4、迭代器
下面要說的迭代器從做用上來講是最基本的部分,但是理解起來比前二者都要費力一些(至少筆者是這樣)。軟件設計有一個基本原則,全部的問題均可以經過引進一個間接層來
簡化,這種簡化在STL中就是用迭代器來完成的
。
歸納來講,迭代器在STL中用來將算法和容器聯繫起來,起着一種黏和劑的做用。幾乎STL提供的全部算法都是經過迭代器存取元素序列進行工做的,每個容器都定義了其自己所專有的迭代器,用以存取容器中的元素。
迭代器部分主要由頭文件<utility>,<iterator>和<memory>組成。
<utility>是一個很小的頭文件,它包括了貫穿使用在STL中的幾個模板的聲明,
<iterator>中提供了迭代器使用的許多方法,而對於<memory>的描述則十分的困難,它以不一樣尋常的方式爲容器中的元素分配存儲空間,同時也爲某些算法執行期間產生的臨時對象提供機制,<memory>中的主要部分是模板類allocator,它負責產生全部容器中的默認分配器。
對於以前不太瞭解STL的讀者來講,上面的文字只是十分歸納地描述了一下STL的框架,對您理解STL的機制乃至使用STL所起到的幫助微乎甚微,這不光是由於深刻STL須要對C++的高級應用有比較全面的瞭解,更由於STL的三個部分算法、容器和迭代器三部分是互相牽制或者說是緊密結合的。從概念上講最基礎的部分是迭代器,但是直接學習迭代器會遇到許多抽象枯燥和繁瑣的細節,然而不真正理解迭代器又是沒法直接進入另兩部分的學習的(至少對剖析源碼來講是這樣)。能夠說,適應STL處理問題的方法是須要花費必定的時間的,可是以此爲代價,STL取得了一種十分難得的獨立性,它經過迭代器能在儘量少地知道某種數據結構的狀況下完成對這一結構的運算,因此下決心鑽研STL的朋友們千萬不要被一時的困難擊倒。其實STL運用的模式相對統一,只要適應了它,從一個STL工具到另外一個工具,都不會有什麼大的變化。
對於STL的使用,也廣泛存在着兩種觀點。第一種認爲STL的最大做用在於充當經典的數據結構和算法教材,由於它的源代碼涉及了許多具體實現方面的問題。第二種則認爲STL的初衷乃是爲了簡化設計,避免重複勞動,提升編程效率,所以應該是「應用至上」的,對於源代碼則沒必要深究。筆者則認爲分析源代碼和應用並不矛盾,經過分析源代碼也能提升咱們對其應用的理解,固然根據具體的目的也能夠有不一樣的側重。
第二部分:
暫且舉幾個很是容易理解的程序源碼:
第三部分:
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++
#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> 通用類型數學宏