最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、模板

對(duì)于一個(gè)交換函數(shù),雖然C++支持函數(shù)重載,我們可以對(duì)多個(gè)交換函數(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或者類類型,那還是得再寫一個(gè)交換函數(shù),這樣原來(lái)寫好的其他類型的交換函數(shù)就沒有復(fù)用起來(lái),大大降低了效率。

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

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

1.1.函數(shù)模板

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

所以函數(shù)模板的參數(shù)并不是一個(gè)具體的類型,只有當(dāng)調(diào)用時(shí)才能確定具體的類型。

其語(yǔ)法為:

//定義模板參數(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;
}

在這里插入圖片描述

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

在這里插入圖片描述

這是因?yàn)楹瘮?shù)模板不是一個(gè)實(shí)際的函數(shù),編譯器不會(huì)為其生成可執(zhí)行代碼。當(dāng)調(diào)用函數(shù)模板時(shí),編譯器會(huì)對(duì)函數(shù)模板進(jìn)行推演,根據(jù)傳入實(shí)參的類型推出T的類型,然后實(shí)例化出不同類型的函數(shù)。

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

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

1.隱式實(shí)例化

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

當(dāng)有多個(gè)類型的實(shí)參而模板參數(shù)列表中只有一個(gè)T時(shí),編譯器將無(wú)法推演出T的類型,此時(shí)可以將實(shí)參進(jìn)行類型強(qiáng)轉(zhuǎn):

在這里插入圖片描述

有趣的是,強(qiáng)轉(zhuǎn)后需要用const T來(lái)接收,因?yàn)閺?qiáng)轉(zhuǎn)后傳入的并不是c,而是c的臨時(shí)變量,這個(gè)臨時(shí)變量是具有常屬性的。

2.顯式實(shí)例化

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

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

在這里插入圖片描述

當(dāng)然對(duì)于類型不同的參數(shù)也要使用const T來(lái)接收。

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

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

1.2.類模板

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

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

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

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

template<class T>
class Vector
{
public:
	Vector(size_t capacity = 10)
		: _pData(new T[capacity])
		, _size(0)
		, _capacity(capacity)
	{}
	~Vector();
	 //頭插尾插等函數(shù)實(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ù)放在類外進(jìn)行定義時(shí),需要加模板參數(shù)列表,否則會(huì)
template <class T>
Vector<T>::~Vector()
{
	if (_pData)
		delete[] _pData;
	_size = _capacity = 0;
}
int main()
{
	Vector<int> s1;
	Vector<double> s2;//實(shí)例化兩個(gè)不同的類對(duì)象
	return 0;
}

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

二、STL

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

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

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

STL存在以下缺陷:

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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 一文帶你了解Qt多線程的實(shí)現(xiàn)方式

    一文帶你了解Qt多線程的實(shí)現(xiàn)方式

    這篇文章主要為大家詳細(xì)介紹了Qt多線程的實(shí)現(xiàn)方式的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • 用C++實(shí)現(xiàn)推箱子小游戲

    用C++實(shí)現(xiàn)推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了用C++實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++示例講解觀察者設(shè)計(jì)模式

    C++示例講解觀察者設(shè)計(jì)模式

    觀察者模式是極其重要的一個(gè)設(shè)計(jì)模式,也是我?guī)啄觊_發(fā)過(guò)程中使用最多的設(shè)計(jì)模式,本文首先概述觀察者模式的基本概念和Demo實(shí)現(xiàn),接著是觀察者模式在C++中的應(yīng)用,最后是對(duì)觀察者模式的應(yīng)用場(chǎng)景和優(yōu)缺點(diǎn)進(jìn)行總結(jié)
    2022-12-12
  • 淺析c#中WebBrowser控件的使用方法

    淺析c#中WebBrowser控件的使用方法

    以下是對(duì)c#中WebBrowser控件的使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • C語(yǔ)言goto的應(yīng)用舉例以及詳解

    C語(yǔ)言goto的應(yīng)用舉例以及詳解

    goto的用法就是改變程序執(zhí)行的順序,從某個(gè)地方跳轉(zhuǎn)到你標(biāo)志的地方,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言goto的應(yīng)用舉例及詳解的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時(shí)候要用new?

    C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時(shí)候要用new?

    這篇文章主要介紹了C++基礎(chǔ)入門教程(六):為什么創(chuàng)建類的時(shí)候要用new?本文講解了使用new創(chuàng)建動(dòng)態(tài)結(jié)構(gòu)體、為什么要有new、自動(dòng)存儲(chǔ)(自動(dòng)變量、局部變量)、動(dòng)態(tài)存儲(chǔ)、vector和array等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • 淺析VSCode tasks.json中的各種替換變量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等

    淺析VSCode tasks.json中的各種替換變量的意思 ${workspaceFolder} ${file} ${

    這篇文章主要介紹了關(guān)于VSCode tasks.json中的各種替換變量的意思 ${workspaceFolder} ${file} ${fileBasename} ${fileDirname}等,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 詳解C語(yǔ)言結(jié)構(gòu)體的定義和使用

    詳解C語(yǔ)言結(jié)構(gòu)體的定義和使用

    這篇文章主要為大家介紹了C語(yǔ)言結(jié)構(gòu)體的定義和使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理初學(xué)者容易犯的6個(gè)錯(cuò)誤分享

    C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理初學(xué)者容易犯的6個(gè)錯(cuò)誤分享

    本篇文章主要介紹了初學(xué)者使用C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理的4個(gè)函數(shù)時(shí)最容易犯的6個(gè)錯(cuò)誤,以及如何避免這些錯(cuò)誤,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-04-04
  • C++容器map和pair對(duì)組實(shí)例詳解

    C++容器map和pair對(duì)組實(shí)例詳解

    pair?是一種模板類,允許將兩個(gè)不同類型的值組合在一起,它由兩個(gè)數(shù)據(jù)成員first和second組成,分別用來(lái)保存這兩個(gè)值,這篇文章主要介紹了C++容器——map和pair對(duì)組,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

瑞金市| 广安市| 河曲县| 洪泽县| 湟中县| 于田县| 阳春市| 图片| 铜鼓县| 正镶白旗| 海淀区| 新宁县| 茂名市| 平昌县| 白朗县| 雷波县| 措美县| 凌海市| 文安县| 特克斯县| 寿阳县| 库车县| 新津县| 望谟县| 芒康县| 洪江市| 宝山区| 应用必备| 边坝县| 龙泉市| 河曲县| 凯里市| 含山县| 乌鲁木齐市| 诸暨市| 蓝山县| 屏东县| 玉环县| 紫金县| 皋兰县| 乌海市|