日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++复习日记3 模板和流

發(fā)布時間:2023/12/20 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++复习日记3 模板和流 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

8月18日復(fù)習了模板和流的相關(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ù)類型不同的操作對象進行邏輯相同的操作時,程序員還需要再寫一個僅僅參數(shù)類型不同的函數(shù)的問題了。

函數(shù)模板實例化時,如果進行替換的實際參數(shù)有多個,他們類型不相同,卻要進行加減、比較等操作,模板機制不會提供參數(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ù)類型無法匹配”。這時需要人為的進行一個重載:

int compare(const int x,const char y);

那么編譯器可以進行隱式類型轉(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(); } ?

標準模板庫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; ? //生成多個隨機數(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))); ?//初始化隨機序列起點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庫定義了五種迭代器,輸入、輸出,正向、雙向、隨機訪問。迭代器在頭文件iterator中聲明,但一般容器頭文件已經(jīng)包含,不用特地去聲明。

STL庫還包含了多種算法,常有的有find查找、find_if條件查找、sort排序等等。算法在頭文件algorithm中聲明。力扣的題凡是用到數(shù)組的地方,大多都會用vector向量代替,并調(diào)用STL庫的操作。大概是因為在減少工作量的同時并不會顯著升高算法復(fù)雜度。畢竟c++是效率之王。


最后一章,c++中的流。記得剛轉(zhuǎn)專業(yè)后補修c++時,因為那個學期課程又多又難,學習c++也是囫圇吞棗,寫代碼只知道一開始就#include<iostream>,再來一個using namespace std;經(jīng)常自己寫完這兩句,后面的寫不下去了,就去CSDN用crtl+c大法,真是說來慚愧。久而久之,就這兩句打起來最熟練,但打了這么多次,卻不知道這兩句是什么意思。iostream的頭文件里包含了哪些東西?std又是一個什么樣的命名空間?都沒有去深究。

今天復(fù)習到這里,終于解開了當時的疑問?!傲鳌敝傅氖菙?shù)據(jù)流,玩過單片機用過串口就知道,數(shù)據(jù)在主從機是怎么進行交互的。流主要指的是輸入流和輸出流,輸入流是從鍵盤鼠標等設(shè)備流向內(nèi)存,輸出流是從內(nèi)存流向顯示器、打印機等等,這都是通過字節(jié)流實現(xiàn),說的再直白些,就是一串八個八個的由“0”或“1”組成的比特流。

c++的流類庫是用繼承的方法建立起的一個類庫,有兩個平行的基類streambuf類和ios類。帶buf的都跟緩存有關(guān),ios類庫則提供了高級的I/O操作。ios派生了兩個類,就是比較熟悉的istream類和ostream類。他倆共同派生了iostream類,就是那個我經(jīng)常無腦包含的頭文件。iostream類也有三個派生類,是文件輸入輸出fstream類、串輸入輸出strstream類和標準輸入輸出stdiostream類。

常用的頭文件除了iostream,還有iomanip,它包含了格式化I/O的帶參數(shù)操縱算子,用于指定輸入輸出格式。頭文件fstream處理文件有關(guān)信息。

標準流cin,cout,cerr和clog,前兩個很熟悉,后兩個是錯誤輸出流,不能重定向。其中,輸入流提取運算符>>有類型轉(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)化為十進制)、showpoint(輸出時顯示小數(shù)點)等等格式控制標志常量,可以給用戶提供方便的格式控制。iomanip中的格式控制符有我們常用的setw(控制輸出寬度),還有setprecision(設(shè)置浮點數(shù)輸出精度)等等。

串流可以連接string對象和字符串。使用串流類要包含sstream頭文件,可以從string對象直接提取/插入數(shù)據(jù)。文件流可以進行對文件的開關(guān)讀寫,要包含fstream頭文件,文件流類提供了直接操作文件的函數(shù)。雖然封裝程度不比python,但也為用戶提供了巨大便利。

總結(jié)

以上是生活随笔為你收集整理的c++复习日记3 模板和流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。