C++學習大綱:標準模板庫


C++學習大綱:標準模板庫

C++ 標準模板庫

1. 容器

容器用於存儲數據元素,它們是由長度(元素個數)可變的同類型的元素所構成的序列,如向量、集合、棧、隊列等。

vector:用於快速定位(訪問)任意位置上的元素以及主要在元素序列的尾部增加/刪除元素的場合。在vector頭文件中定義,用動態數組實現。

map 和 multimap:元素按關鍵字排序,multimap中不同元素的關鍵字可以相同,在map頭文件中定義,常常用某種二叉樹實現。

set和multiset:在set頭文件中定義,set可以用於去重。

basic_string:與vector相似,不同之處在於其元素類型是字符類型,並提供一系列與字符串相關的操作。string和wstring是它的兩個實例basic_string<char>和basic_string<wchar>。在string頭文件中定義。/<wchar>/<char>

list:用於經常在元素序列中任意位置上插入/刪除元素的場合。在list頭文件中定義,用雙向鏈表實現。

deque:用於主要在元素序列的兩端增加/刪除元素以及需要快速定位(訪問)任意位置上的元素的場合。在deque頭文件定義,用分段的連續空間結構實現。

stack:用於僅在元素序列的尾部增加/刪除元素的場合,在stack頭文件中定義,一般基於deque來實現。

queue:用於僅在元素序列的尾部增加,頭部刪除元素的場合。在queue頭文件中定義,一般基於deque來實現。

priority_queue:與queue的操作類似,不同之處在於每次增加元素之後,它將對元素位置進行調整,使得頭部元素總是最大的。也就是說,每次刪除的總是最大的元素。在queue頭文件中定義,一般基於vector和heap結構來實現。

2. 迭代器

迭代器實現了抽象的指針(智能指針),它們指向容器中的元素,用於對容器中的元素進行訪問和遍歷。

輸入迭代器:只能用於讀取它所指向的容器元素。

輸出迭代器:只能用於修改它所指向的容器元素。

前向迭代器:可以用於讀取和修改它所指向的容器元素。

雙向迭代器:可以用於讀取/修改它所指向的容器元素。

隨機訪問迭代器:可以用於讀取/修改它所指向的容器元素。

3. 算法

調序算法:改變容器中元素的次序。如sort reverse random_shuffle等

編輯算法:用於實現對容器元素的複製、替換、刪除、交換、合併、賦值等操作。如copy replace remove unique swap等

查找算法:用於在容器中查找元素或子元素序列。如find count search等

算術算法:用於對容器內的元素進行求和、內積和、差等。如accumulate partial_sum inner_product等

集合算法:用於實現集合的運算。如include set_union set_intersection等

堆算法:用於實現按對結構存儲和操作容器中的元素,具有堆結構的容器的主要特點之一是:第一個元素總是最大的。如make_heap pop_heap等

元素遍歷並操作算法:依次訪問一個範圍內的每個元素,並對每個元素調用某個指定的操作函數或函數對象f。for_each

————————————————


C++學習大綱:標準模板庫

C++標準模板庫(STL)學習精要

這一篇主要對C++中使用最廣泛的STL進行學習梳理,參照此文再配合STL參考手冊,輕鬆掌握編程精要!

1、STL基本頭文件

STL主要包含容器、算法和迭代器三個部分。容器實現了大多數數據結構;迭代器類似指針,通過它的有序移動將容器中的元素與算法關聯起來,是實現STL的基礎。常用的STL包含頭文件如下:

image.png

STL包含文件均不含擴展名,其源文件位置一般是在編譯器VC安裝目錄的include內。

2、模板

模板分為函數模板和類模板。函數模板與預處理的用法類似,提供編譯過程中的文本替換功能,對類型有一定的保護;類模板可以編寫通用的、類型安全的類。

STL的思想就是內存的動態分配、銷燬、再分配,將內存管理部分進一步抽象,編成系統代碼,應用過程中用戶可不必明白內存的變化,不必自己編寫代碼來管理內存。

STL標準模板庫強調軟件的複用。Traits技術是採用的重要手段,它提取不同類的共性,以便能統一處理,它依賴將顯式模板特殊化將不同的部分用統一接口來包裝。STL中有大量的模板函數,故很多時候要重載與之對應的操作符。函數模板相當於應用框架,操作符重載相當於調用接口。

3、迭代器

迭代器是STL重要的核心技術,提供了統一訪問容器元素的方法。迭代器即指針,可以是所需的任何類型,它是最大好處是使容器與算法分離。因為不同容器中完成相同功能代碼的思路大體相同,將其抽象出來就產生了迭代器,這是泛型編程的思想。

在自己動手編寫迭代器時,要在類中增加begin()、end()函數,用於獲取起止迭代指針,要增加相應迭代器類,重載相關運算符,從而可以調用。

特定容器有特定的迭代器,故將迭代器作為內部類更適合應用。每個容器均有對應的迭代器,容器通過迭代器共享某一具體算法,而算法不具體依賴某一具體容器。由此可見,STL的編程思想是:1.形成容器元素;2.取出所需的迭代指針;3.調用通用算法。STL迭代器共分五大類型:

輸入迭代器istream_iterator,按其順序只能讀取一次。構造函數可參閱STL庫;

輸出迭代器ostream_iterator,按順序只寫一次。構造函數可參閱STL庫;

前向迭代器,這種迭代器包含了輸入輸出迭代器兩者所有可能,可以對一個值多次讀寫。前向迭代器只能向前移動;

雙向迭代器,具有前向迭代器的全部功能,它也可以向後移動操作;

隨機訪問迭代器,具有雙向迭代器的全部功能,再加上一個指針的所有功能。

從以上可以看出,從前到後迭代器是一步步細化的,編程時根據實際情況選擇適宜的迭代器,從而達到最高的效率。

4、輸入輸出流

標準輸入流cin指鍵盤,標準輸出流cout指顯示器。運算符”<>”用作提取符,表明“賦值給”。cin輸入時,各數值間默認以空格為分界符的。

在交互過程中,一般要一次輸入一行字符,為彌補cin的缺陷,可以改用get系統函數。get和getline函數的區別在於,get遇停止符時,不從輸入流中提取界定符,而直接在末尾加”\\0”標誌,getline則從輸入流中提取界定符,但不會將其放入結果緩衝區。

處理流錯誤:

C++對每次輸入輸出操作的結果都記錄了其狀態信息,主要函數如下:

image.png

文件輸入輸出流:

C++中文件讀寫用到的很多常數都在基類ios被定義出來,ifstream類只用於讀取文件數據,ofstream類只用於寫入數據到文件,fstream類則可以用於讀取和寫入文件數據。

文件打開的三個流都是用構造函數或open函數來實現,第一個參數是文件名,第二個參數是打開方式,打開方式如下:

image.png

文件關閉的三個流都是用close()函數釋放文件資源;

文件的讀寫分為兩種情況:當讀寫文本文件時,可直接創建輸入輸出文件對象來完成操作;當讀寫二進制文件時,主要通過流對象中的read、write函數實現,不過也要創建流對象;

定位輸入輸出流。流的位置標識有三個:

image.png

字符串輸入輸出流:

字符串輸入輸出流類是直接對內存而不是對文件或標準輸出進行的操作。它使用cin、cout相同的格式函數來操作內存中的數據。全部的字符串流類聲明都包含在標準頭文件<sstream>中,標準庫定義了三種串流:/<sstream>

Istringstream:字符串輸入流,提供讀string功能;

Ostringstream:字符串輸出流,提供string寫功能;

Stringstream:字符串輸入輸出流,提供讀寫string功能;

利用字符串輸入輸出流,可以方便地將多種基本數據類型組合成字符串,也可以反解字符串。

5、函數對象

將函數作為對象是程序設計的新的思維,STL通過重載類中operator函數實現函數對象的功能。標準C++庫根據operator()參數個數為0,1,2劃分,有如下幾種函數對象:

a. 發生器:沒有參數且返回任意類型值的函數對象,如隨機函數發生器;

b. 一元函數:只有一個任意類型的參數,返回一個可能不同類型的函數對象;

c. 二元函數:兩個任意類型參數,且返回一個任意類型的函數對象;

d. 一元判定函數:返回bool類型的一元函數;

e. 二元判定函數:返回bool類型的二元函數;

6、通用容器

STL提供了專家級的各種容器,功能更好,複用性更強,在應用程序開發過程中儘可能應用STL。

容器可以分為以下三類:

a. 序列性容器:按線性序列來存儲某類型值的集合,每個元素都有自己特定的位置,順序容器主要有vector、deque、list;

b. 關聯式容器:它更注重快速高效的檢索數據的能力,根據鍵值key來檢索數據。容器中成員在初始化後都是按一定順序排好的,關聯式容器主要有set、multiset、map、multimap;

c. 容器適配器:對已有容器進行某些特性的再封裝,它不是一個新容器,主要有stack、queue;

各容器的共性和區別:

各容器一般來說都有下列函數:默認構造函數、複製構造函數、析構函數、empty()、max_size()、size()、operator=、operator、operator>=、operator==、operator!=、swap()。

順序容器和關聯容器都共有下列函數:

image.png

a. vector容器是動態數組,在堆中分配內存,元素連續存放,有保留內存。若減少大小後內存也不會釋放,當元素個數大於當前容量時,會分配原來2倍容量,從而將元素複製到新空間,原空間釋放。可以快速隨機訪問元素,快速在末尾插入刪除元素,此過程中不用移動內存;對中間元素插入刪除時要移動內存。若元素是結構體類型或類,移動內存時還要進行構造和析構操作。vector可以使用[]操作符。

b. deque是雙端隊列,可以快速地隨機訪問元素,快速地在開始和末尾插入刪除元素。隨機插入比兩端插入要慢,重新分配內存比vector要快。重新分配空間後,原空間保持,只是新建立了一個內存塊,將新數據插入這個內存塊,沒有空間的複製刪除過程,故deque是由多個分段連續的內存空間組成。因此,deque在某一位置上的操作是線性的,各小片內存間用鏈表相連,還是可以使用[],只是沒有vector快。對deque排序,可以將其複製到vector中排完序後再複製回去。

c. list是一種雙線性列表,只能順序訪問,不支持隨機訪問。對每個元素分配空間,不存在空間不夠和重新分配的情況。

d. set是集合,支持快速查找,不允許有重複值,用平衡樹結構來存儲;multiset支持快速查找,允許有重複值。

e. map是映射,一對一映射,支持關鍵字快速查找,不允許有重複值;multimap是一對多映射,基於關鍵字查找,允許有重複值。

===================本篇完結======================

C++學習大綱:標準模板庫

通過分享實用的計算機編程語言乾貨,推動中國編程到2025年基本實現普及化,使編程變得全民皆知,最終實現中國編程之崛起,這裡是中國編程2025,感謝大家的支持。

原文鏈接:https://blog.csdn.net/haitaolang/article/details/70880835

原文鏈接:https://blog.csdn.net/huixieqingchun/article/details/79368351


分享到:


相關文章: