亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中模板和STL介紹詳解

 更新時間:2021年09月22日 15:38:00   作者:精致的灰(>_<)  
今天小編就為大家分享一篇關于C++模板和STL的介紹,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

一、模板

對于一個交換函數(shù),雖然C++支持函數(shù)重載,我們可以對多個交換函數(shù)起相同的名字:

void Swap(int& left, int& right) 
{
 int temp = left;
 left = right;
 right = temp; 
 }
void Swap(double& left, double& right) 
{
 double temp = left;
 left = right;
 right = temp; 
 }

但是依然有不足的地方,比如如果我們要交換其他類型,比如char或者類類型,那還是得再寫一個交換函數(shù),這樣原來寫好的其他類型的交換函數(shù)就沒有復用起來,大大降低了效率。

因此,C++引入了模板的概念,通過模板,即可實現(xiàn)一份代碼交換不同數(shù)據(jù)。

模板,其實就是告訴編譯器一個模子,讓編譯器根據(jù)不同的類型利用該模子來生成代碼。

1.1.函數(shù)模板

**泛型編程:**在之前,函數(shù)都是針對某個具體的類型(比如int,char),而泛型則是針對一個廣泛的類型。模板則是泛型編程的基礎。

所以函數(shù)模板的參數(shù)并不是一個具體的類型,只有當調用時才能確定具體的類型。

其語法為:

//定義模板參數(shù)T可以用typename,也可以使用class
template<typename T1, typename T2,......,typename Tn>
返回值類型 函數(shù)名(用泛型指定的參數(shù)列表)
{
}

以交換函數(shù)為例:

template<typename T>
void Swap(T& left, T& right) 
{
	T temp = left;
	left = right;
	right = temp;
}
int main()
{
	int a = 10, b = 20;
	double c = 1.1, d = 2.2;
	Swap(a, b);
	Swap(c, d);
	cout << a << " " << b << endl;
	cout << c << " " << d << endl;
}

在這里插入圖片描述

從反匯編可以看出,這兩個函數(shù)調用的并不是同一個函數(shù):

在這里插入圖片描述

這是因為函數(shù)模板不是一個實際的函數(shù),編譯器不會為其生成可執(zhí)行代碼。當調用函數(shù)模板時,編譯器會對函數(shù)模板進行推演,根據(jù)傳入實參的類型推出T的類型,然后實例化出不同類型的函數(shù)。

1.1.1.兩種函數(shù)模板的實例化

用不同類型的參數(shù)使用函數(shù)模板時,稱為函數(shù)模板的實例化。

1.隱式實例化

讓編譯器根據(jù)實參推演模板參數(shù)的實際類型

當有多個類型的實參而模板參數(shù)列表中只有一個T時,編譯器將無法推演出T的類型,此時可以將實參進行類型強轉:

在這里插入圖片描述

有趣的是,強轉后需要用const T來接收,因為強轉后傳入的并不是c,而是c的臨時變量,這個臨時變量是具有常屬性的。

2.顯式實例化

在函數(shù)名后的<>中指定模板參數(shù)的實際類型

通過這種方式可以不讓編譯器推演類型,而是使用我們指定的類型。

在這里插入圖片描述

當然對于類型不同的參數(shù)也要使用const T來接收。

1.1.2.模板參數(shù)的匹配原則

一個非模板函數(shù)可以和一個同名的函數(shù)模板同時存在,調用的時候如果與非模板函數(shù)匹配,編譯器會優(yōu)先調用非模板函數(shù)。如果非模板函數(shù)不匹配或者進行了實例化,則會調用函數(shù)模板。

1.2.類模板

對于一個類的成員變量也可以使用模板,這樣在定義類對象的時候就可以實例化出具有不同類型的成員變量和成員函數(shù)的對象了。

如果類模板中函數(shù)放在類外進行定義時,需要加模板參數(shù)列表,否則會找不到T。

模板也不支持分離編譯,建議定義在一個文件中。

以動態(tài)順序表為例:

template<class T>
class Vector
{
public:
	Vector(size_t capacity = 10)
		: _pData(new T[capacity])
		, _size(0)
		, _capacity(capacity)
	{}
	~Vector();
	 //頭插尾插等函數(shù)實現(xiàn)。。。
	size_t Size() 
	{ 
		return _size; 
	}
	T& operator[](size_t pos)
	{
		assert(pos < _size);
		return _pData[pos];
	}
private:
	T* _pData;
	size_t _size;
	size_t _capacity;
};
//類模板中函數(shù)放在類外進行定義時,需要加模板參數(shù)列表,否則會
template <class T>
Vector<T>::~Vector()
{
	if (_pData)
		delete[] _pData;
	_size = _capacity = 0;
}
int main()
{
	Vector<int> s1;
	Vector<double> s2;//實例化兩個不同的類對象
	return 0;
}

類模板實例化與函數(shù)模板實例化不同,類模板實例化只能顯示實例化,需要在類模板名字后跟<>,然后將實例化的類型放在<>中即可,類模板名字不是真正的類,而實例化的結果才是真正的類。

二、STL

STL,英文全稱 standard template library,中文可譯為標準模板庫或者泛型庫,其包含有大量的模板類和模板函數(shù),是 C++ 提供的一個基礎模板的集合,用于完成諸如輸入/輸出、數(shù)學計算等功能。

STL有六大組件,但主要包含容器、算法和迭代器三個部分。

容器(Containers):用來管理某類對象的集合。各種數(shù)據(jù)結構,如vector、list、deque、set、map等,用來存放數(shù)據(jù),從實現(xiàn)角度來看,STL容器是一種class template。
算法(Algorithms):用來處理對象集合中的元素,各種常用的算法,如sort、find、copy、for_each。從實現(xiàn)的角度來看,STL算法是一種function template。
迭代器(Iterators):用來在一個對象集合的元素上進行遍歷動作。扮演了容器與算法之間的膠合劑,共有五種類型,從實現(xiàn)角度來看,迭代器是一種將operator* , operator-> , operator++, operator–等指針相關操作予以重載的class template。所有STL容器都附帶有自己專屬的迭代器,只有容器的設計者才知道如何遍歷自己的元素。原生指針(native pointer)也是一種迭代器。
仿函數(shù):行為類似函數(shù),可作為算法的某種策略。從實現(xiàn)角度來看,仿函數(shù)是一種重載了operator()的class 或者class template。
適配器:一種用來修飾容器或者仿函數(shù)或迭代器接口的東西。
空間配置器:負責空間的配置與管理。從實現(xiàn)角度看,配置器是一個實現(xiàn)了動態(tài)空間配置、空間管理、空間釋放的class tempalte。

STL存在以下缺陷:

STL庫的更新太慢了。上一版靠譜是C++98,中間的C++03基本一些修訂。C++11出來已經(jīng)相隔了13年,STL才進一步更新。STL現(xiàn)在都沒有支持線程安全。并發(fā)環(huán)境下需要我們自己加鎖。且鎖的粒度是比較大的。STL極度的追求效率,導致內部比較復雜。比如類型萃取,迭代器萃取。STL的使用會有代碼膨脹的問題,比如使用vector/vector/vector這樣會生成多份代碼,當然這是模板語法本身導致的。

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!

相關文章

  • C語言實現(xiàn)數(shù)據(jù)結構串(堆分配存儲表示法)實例詳解

    C語言實現(xiàn)數(shù)據(jù)結構串(堆分配存儲表示法)實例詳解

    這篇文章主要介紹了C語言實現(xiàn)數(shù)據(jù)結構串(堆分配存儲表示法)實例詳解的相關資料,需要的朋友可以參考下
    2017-07-07
  • VSCode遠程開發(fā)調試服務器c/c++代碼

    VSCode遠程開發(fā)調試服務器c/c++代碼

    語音相關的好多項目要在linux上跑,但代碼開發(fā)大多是在PC機上,本篇簡單介紹一下怎么在個人電腦上用VSCode遠程開發(fā)調試服務器上的c/c++代碼。感興趣的朋友跟隨小編一起看看吧
    2020-04-04
  • OpenCV實現(xiàn)圖像角點檢測

    OpenCV實現(xiàn)圖像角點檢測

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像角點檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C++中vector類的一些簡單實現(xiàn)

    C++中vector類的一些簡單實現(xiàn)

    C++中的std::vector是一個動態(tài)數(shù)組(也被稱為可變大小數(shù)組)的容器類,它是C++標準庫提供的其中一種容器類,提供了方便的操作和管理動態(tài)數(shù)組的功能,本文就給大家介紹了C++中vector類的簡單實現(xiàn)代碼,需要的朋友可以參考下
    2023-08-08
  • C語言中常見的幾種流程控制語句

    C語言中常見的幾種流程控制語句

    這篇文章主要給大家介紹了關于C語言中常見的幾種流程控制語句,分別包括goto語句、if語句、switch語句、while循環(huán)、do...while循環(huán)、for循環(huán)以及break和continue等,需要的朋友可以參考下
    2021-08-08
  • 用c語言實現(xiàn)和平精英的完整代碼

    用c語言實現(xiàn)和平精英的完整代碼

    這篇文章主要介紹了用c語言實現(xiàn)和平精英的完整代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 詳解C/C++如何獲取路徑下所有文件及其子目錄的文件名

    詳解C/C++如何獲取路徑下所有文件及其子目錄的文件名

    這篇文章主要為大家詳細介紹了在C/C++中如何獲取路徑下所有文件及其子目錄的文件名,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-03-03
  • JsonCpp中double的問題解決

    JsonCpp中double的問題解決

    本文主要介紹了JsonCpp中double的問題解決,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 基于C++的攝像頭圖像采集及拼接程序的簡單實現(xiàn)

    基于C++的攝像頭圖像采集及拼接程序的簡單實現(xiàn)

    本程序是在?ubuntu14.04?平臺下實現(xiàn)的,在本項目目錄下,已經(jīng)有編譯生成的可執(zhí)行程序,其中Camera_to_Frmae.cpp是我們從雙攝像頭實時抓取單幀圖像的源碼,對基于C++的攝像頭圖像采集及拼接程序的實現(xiàn)感興趣的朋友一起看看吧
    2022-01-01
  • VSCODE調試RDKit內核的方法步驟(C++)

    VSCODE調試RDKit內核的方法步驟(C++)

    本文主要介紹了VSCODE調試RDKit內核的方法步驟,這個過程可以分為三個部分:安裝 RDKit 所需環(huán)境,安裝 VSCode 相應插件, 寫調試代碼編譯,感興趣的可以了解一下
    2021-08-08

最新評論