模版介紹與STL六大元件

2021-10-18 18:44:14 字數 1855 閱讀 2916

本文主要介紹c++中模版和stl六大元件。理解模版有助於更好的理解stl六大元件,乃至整個stl。

模版的學習成本較高,那麼為什麼要了解模版呢?

模版可以說是stl的大門,也是泛型程式設計的基礎。學習模版可以讓自己對於c++的學習更加自信,也能在面試的時候更加胸有成竹。

本部分僅僅總結本人自己所學,不能覆蓋模版的各個細節,但盡量將相應的重點總結出來,以能幫助大家理解。

模版是什麼

參考c語言中的巨集的概念,在一定程度上可以將模版模擬與c語言中的巨集;

當然,更官方的說法–模版是一種**生成器,可以在編譯期生成你想要的**。

在c++中,模版一般會涉及到函式模版類模版

首先看下函式模版的定義,如下定義乙個qtmp函式模版

template t qtmp(t val)
注:模版引數列表不能為空

模版引數列表可模擬函式引數列表,與函式引數列表不同的是模版引數列表的輸入範圍更侷限(使用者自定義型別,以及c++內嵌型別)。

有了模版函式定義,那麼在**中如何使用呢?其使用方式如下

auto val = qtmp(2); // t推導為int
該過程叫做模版例項化。關於上述模版引數型別推導,將在模版高階中講解。

類模版–類**生成器。在c++17之前,不能通過類建構函式推斷模版引數型別,但c++17開始,便可由類建構函式推斷類模版引數型別。

定義qcpp類模版如下

template class qtmp 

template t add(const u& val)

void sub(const t& val);

};

通過該類模版的定義可以得出:類模版的建構函式可以直接使用類模版名(qtmp), 類模版成員函式也可以定義模版函式。

上述sub函式未在類模版中定義,我們可以在類模版之外進行定義,其語法如下

template void qtmp::sub(const t& val)
同模版函式一樣,可以通過如下方式使用類模版

qtmpqt;

qtmp qt; // 此種用法錯誤

如果使用qtmp,則會報錯,這是因為qtmp並不是某種型別,qtmpstd::string 才是類的例項化。

注:一般情況下,類模版模版成員函式只有在使用到時才會被例項化

為什麼說一般情況下呢?

模版只有被使用的時候才會例項化,因此如果多個檔案例項化了同樣的類模版,則此時每個檔案就會有該模版的乙個例項。這會造成**的膨脹以及二進位制檔案膨脹。

因此針對此種情況,可以通過顯示例項化來解決。乙個顯示例項化有如下形式

extern template declaration; // 例項化宣告

template declaration; // 例項化定義

declaration是乙個類或者函式宣告,其中所有模版引數已被替換為模版實參。 譬如,

extern template qtmp;
當編譯器遇到extern模版宣告時,它不會在本檔案中生成例項化**。extern承諾在程式其他位置有該例項化的乙個非extern宣告(定義),且該定義必須只有乙個。

注:extern宣告必須出現在任何使用此例項化版本的**之前

對於每個例項化宣告,在程式中某個位置必須有其顯式的例項化定義,顯示例項化定義會例項化所有成員。

STL六大元件

stl提供六大元件,彼此可以組合套用。1 容器 containers 各種資料結構。如vector,list,deque,set,map,用來存放資料。容器又可以分為順序容器和關聯容器.順序容器 vector,list,deque,stack,queue,heap,priority queue,sl...

STL 六大元件

1.容器 containers 各種資料結構,如vector,list,deque,set,map,用來存放資料。從實現的角度看,stl容器是一種class template。2.演算法 algorithms 各種常用的演算法如sort,search,copy,erase 從實現的角度看,stl演算...

STL六大元件

容器 containers 各種資料結構,如 vector list deque set map 用來存放資料。演算法 algorithms 各種常用演算法,如 sort search copy erase 分配器 allocators 負責空間配置與管理。迭代器 iterators 容器與演算法之...