c++复习日记3 模板和流
8月18日復(fù)習(xí)了模板和流的相關(guān)內(nèi)容。
模板,簡單地說就是一個“多功能”的程序模塊。這個模塊的輸入,不限定某一個類型。
具體來說,對于模板函數(shù),傳入?yún)?shù)的數(shù)據(jù)類型可以不固定,但邏輯結(jié)構(gòu)要相同。模板函數(shù)說明可以寫為:
template <typename 類型形參>; 返回類型(可以是類型形參) 函數(shù)名(類型形參 參數(shù)名A,類型形參 參數(shù)名B);參數(shù)A和B可以是不固定的類型。調(diào)用時如果使用:
cin>>a>>b; cout<<函數(shù)名(a,b);那么在調(diào)用這個函數(shù)時,編譯器將調(diào)用參數(shù)類型為輸入的a和b的數(shù)據(jù)類型的重載版本的函數(shù)。這個過程也就是實例化。這樣一來,就可以避免在對數(shù)據(jù)類型不同的操作對象進(jìn)行邏輯相同的操作時,程序員還需要再寫一個僅僅參數(shù)類型不同的函數(shù)的問題了。
函數(shù)模板實例化時,如果進(jìn)行替換的實際參數(shù)有多個,他們類型不相同,卻要進(jìn)行加減、比較等操作,模板機(jī)制不會提供參數(shù)類型自動轉(zhuǎn)換。也就是說:
template <typename a>; a compare(const a x,const a y) {return x>y?x:y;}如果有參數(shù)int x和char y,那么調(diào)用函數(shù)模板在實例化時將會報錯“參數(shù)類型無法匹配”。這時需要人為的進(jìn)行一個重載:
int compare(const int x,const char y);那么編譯器可以進(jìn)行隱式類型轉(zhuǎn)換,這時再調(diào)用函數(shù),無論是char類型在前還是int類型在前,都就可以正常執(zhí)行了。
除了有函數(shù)模板,還有類模板。在定義類前說明一個類屬類型,用這個類型去定義類中的一些函數(shù)成員或者數(shù)據(jù)成員。類模板的實例化和函數(shù)模板的實例化類似,都是賦予一個具體的數(shù)據(jù)類型。類模板可以作為函數(shù)參數(shù),也可以在作為派生類從類模板派生或普通類派生。模板類也可以從類模板派生或普通類派生。從類模板派生模板類的例子:
#include <iostream> using namespace std; template <typename a> class Base ? ? ? //定義基類:類模板 { public:Base(a x) {xx = x;}void out() { cout << xx << endl; } protected:a xx; }; class First :public Base<int> ? //派生模板類 { public:First(int y, double yy) :Base<int>(y) { k=yy; }void out() { Base<int>::out();cout << k << endl; } protected:double k; }; int main() {Base<int> data1(3);data1.out();First data2(1, 2);data2.out(); } ?標(biāo)準(zhǔn)模板庫STL主要組件有容器、迭代器和算法。容器是數(shù)據(jù)結(jié)構(gòu):
序列容器:vector向量、deque雙向隊列、list雙向鏈表
關(guān)聯(lián)容器:set集合、multiset集合((允許重復(fù)值元素)、map映射、multimap映射(允許重復(fù)值元素)
容器適配器:stack堆棧(LIFO)、queue隊列(FIFO)、pirority_queue優(yōu)先隊列
對容器有一些共同的操作:
Container c(beg,end) 以beg地址為起點,到地址end的數(shù)據(jù)序列作為初值構(gòu)造容器
c.size() 返回容器元素個數(shù)
c.begin() c.end() 顧名思義
c.insert(pos,elem) 在迭代器pos所指位置前插入elem
c.clear() 清空容器
還有一些序列容器特有的操作:
c.front() /c.back() 訪問容器首/尾元素數(shù)據(jù)
c.push_back(elem)/c.pop_back() 插入/刪除尾元素數(shù)據(jù)
c[i] 訪問第i個元素
下面是一個STL容器操作的例子:
#include <iostream> #include <list> #include <cstdlib> #include <ctime> using namespace std; //建立有序鏈表 void creatList(list<int>& orderList, int Len) {int i, k;for (i = 0;i < Len;i++){k = rand() % 100; ? //生成多個隨機(jī)數(shù)orderList.push_back(k); ?//插入容器末尾}orderList.sort(); ? ? ? ?//排序 }; //輸出鏈表 void outList(list<int>& List) {list<int>::iterator p; ?//建立迭代子pp = List.begin();while (p != List.end()){cout << *p << " ";p++;}cout << "\r\n"; ? }; //合并鏈表 void inorderMerge(list<int>& A1, list<int> A2) {A1.merge(A2); }; int main() {list<int> A1, A2;srand(int(time(0))); ?//初始化隨機(jī)序列起點creatList(A1, 10);outList(A1);cout << endl;creatList(A2, 5);outList(A2);cout << endl;inorderMerge(A1, A2);outList(A1); }迭代子好比一個可以指向容器內(nèi)元素的指針,可以通過c.begin() c.end() 指向首尾。迭代子也有著類似指針的操作,*p是其所指向的對象。STL庫定義了五種迭代器,輸入、輸出,正向、雙向、隨機(jī)訪問。迭代器在頭文件iterator中聲明,但一般容器頭文件已經(jīng)包含,不用特地去聲明。
STL庫還包含了多種算法,常有的有find查找、find_if條件查找、sort排序等等。算法在頭文件algorithm中聲明。力扣的題凡是用到數(shù)組的地方,大多都會用vector向量代替,并調(diào)用STL庫的操作。大概是因為在減少工作量的同時并不會顯著升高算法復(fù)雜度。畢竟c++是效率之王。
最后一章,c++中的流。記得剛轉(zhuǎn)專業(yè)后補(bǔ)修c++時,因為那個學(xué)期課程又多又難,學(xué)習(xí)c++也是囫圇吞棗,寫代碼只知道一開始就#include<iostream>,再來一個using namespace std;經(jīng)常自己寫完這兩句,后面的寫不下去了,就去CSDN用crtl+c大法,真是說來慚愧。久而久之,就這兩句打起來最熟練,但打了這么多次,卻不知道這兩句是什么意思。iostream的頭文件里包含了哪些東西?std又是一個什么樣的命名空間?都沒有去深究。
今天復(fù)習(xí)到這里,終于解開了當(dāng)時的疑問。“流”指的是數(shù)據(jù)流,玩過單片機(jī)用過串口就知道,數(shù)據(jù)在主從機(jī)是怎么進(jìn)行交互的。流主要指的是輸入流和輸出流,輸入流是從鍵盤鼠標(biāo)等設(shè)備流向內(nèi)存,輸出流是從內(nèi)存流向顯示器、打印機(jī)等等,這都是通過字節(jié)流實現(xiàn),說的再直白些,就是一串八個八個的由“0”或“1”組成的比特流。
c++的流類庫是用繼承的方法建立起的一個類庫,有兩個平行的基類streambuf類和ios類。帶buf的都跟緩存有關(guān),ios類庫則提供了高級的I/O操作。ios派生了兩個類,就是比較熟悉的istream類和ostream類。他倆共同派生了iostream類,就是那個我經(jīng)常無腦包含的頭文件。iostream類也有三個派生類,是文件輸入輸出fstream類、串輸入輸出strstream類和標(biāo)準(zhǔn)輸入輸出stdiostream類。
常用的頭文件除了iostream,還有iomanip,它包含了格式化I/O的帶參數(shù)操縱算子,用于指定輸入輸出格式。頭文件fstream處理文件有關(guān)信息。
標(biāo)準(zhǔn)流cin,cout,cerr和clog,前兩個很熟悉,后兩個是錯誤輸出流,不能重定向。其中,輸入流提取運(yùn)算符>>有類型轉(zhuǎn)換功能,可以把輸入的空格、Tab轉(zhuǎn)換成分隔符。而istream中一些函數(shù)可以實現(xiàn)特殊的提取功能,如get可以從流中提取字符包括空格,這也是為什么檢測輸入空格時經(jīng)常用get。getline從流中提取一行字符;read無格式輸入指定字節(jié)數(shù)。 輸出流提供了成員函數(shù)put和write,可以在輸出中插入字節(jié)或是字節(jié)序列。
輸入輸出流中有著格式控制的功能。ios提供了如dec(輸入/輸出轉(zhuǎn)化為十進(jìn)制)、showpoint(輸出時顯示小數(shù)點)等等格式控制標(biāo)志常量,可以給用戶提供方便的格式控制。iomanip中的格式控制符有我們常用的setw(控制輸出寬度),還有setprecision(設(shè)置浮點數(shù)輸出精度)等等。
串流可以連接string對象和字符串。使用串流類要包含sstream頭文件,可以從string對象直接提取/插入數(shù)據(jù)。文件流可以進(jìn)行對文件的開關(guān)讀寫,要包含fstream頭文件,文件流類提供了直接操作文件的函數(shù)。雖然封裝程度不比python,但也為用戶提供了巨大便利。
總結(jié)
以上是生活随笔為你收集整理的c++复习日记3 模板和流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解Linux内核链表
- 下一篇: 解读Android 4.0 Camera