chapter8 編寫泛型函式

2021-09-29 14:40:21 字數 1805 閱讀 6805

示例

templatet median(std::vectorv)
template – 模板頭

告訴系統環境,定義的是乙個模板函式

typedef typename std::vector::size_type vec_sz;

告訴系統環境,整個名稱當作乙個環境來處理

如果我們在宣告中使用了由模板型別引數定義的型別,那麼就必須用關鍵字 typename 來限定這個宣告

模板例項化

例項化動作通常在鏈結期間發生,而不是在編譯期間發生

只有模板被例項化了,系統環境才能證實,模板**能被用於指定的型別,因此在鏈結期間,我們就可以發現那些看起來在編譯期間可能發生的錯誤

為了對乙個模板進行例項化,系統環境要求模板的定義+宣告必須是系統環境可以訪問的 ----> 模板的標頭檔案和原始檔都要可以訪問 ----> 模板的標頭檔案直接寫模板定義,或者在標頭檔案#include 「sourcefile.cpp」,否則會報錯

迭代器分為 5 種

(1)輸入迭代器

按乙個方向順序訪問,只能輸入

所有容器的迭代器都支援

(2)輸出迭代器

按乙個方向順序訪問,只能輸出

所有容器的迭代器都支援

(3)正向迭代器

按乙個方向順序訪問,既能輸入也能輸出

所有容器的迭代器都支援

(4)雙向迭代器

按兩個方向順序訪問,既能輸入也能輸出

所有容器的迭代器都支援

(5)隨機訪問迭代器

能有效訪問任何元素,既能輸入也能輸出

vector和string的迭代器支援

迭代器區間 [begin, end) 的原因

(1) 當區間無元素時,無法找到最後乙個元素標記終點

(2) 只需判定相等/不相等即可,無需定義小於操作

(3) 可以自然表示「區間外」的概念

標準庫提供了可以被連線到輸入流和輸出流的迭代器

(1) 用於 istream 的迭代器滿足了輸入迭代器的要求

vectorv;

// 從標準輸入中讀取整數值,並新增到v中

copy(istream_iterator(cin), istream_iterator(), back_inserter(v));

(2) 用於 ostream 的迭代器滿足了輸出迭代器的要求

vectorv;

// 輸出v的元素,元素之間用空格分隔

copy(v.begin(), v.end(), ostream_iterator(cout, " "));

使用迭代器可以提高適應性

示例

templatevoid split(const string &str, out os) 

i = j;

}}

這個方法的作用是將提取一句話中的各個單詞,使用了迭代器的好處是提供了統一的介面,可以輸出到任何容器型別中:

string s = "i'm a good man";

split(s, back_inserter(word_list));

通過 back_inserter,可以獲取任何容器的目標位置,而不必關心容器本身是 vector 還是 list

Chapter 8 理解需求

在專案起始階段,要建立基本的理解,包括存在的問題 誰需要解決方案 所期望解決方案的性質 與專案利益相關者和開發人員之間達成初步交流合作的效果。詢問客戶 使用者和其他人 系統或產品的目標是什麼,想要實現什麼,系統和產品如何滿足業務的要求,最終系統或產品如何用於日常工作。在起始和獲取階段獲得的資訊將在細...

Chapter 8 陣列的使用

一 c 一維陣列 語法 datatype arrayname size eg int nums 25 char array of name 30 double curr salary 35 二 陣列的長度可以是常量 const int n 50 int emp id n const int size...

泛型函式Func

泛型函式,即可以接受任何型別的通用函式 有where約束除外 例如 呼叫getcachedata,那第二個委託引數就是func,這個函式返回值也是int 呼叫getcachedata,那第二個委託引數就是func,這個函式返回值是string public static intstrtoint st...