91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中模板和STL的示例分析

發布時間:2021-09-24 11:42:18 來源:億速云 閱讀:134 作者:小新 欄目:開發技術

這篇文章主要介紹了C++中模板和STL的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    一、模板

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

    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或者類類型,那還是得再寫一個交換函數,這樣原來寫好的其他類型的交換函數就沒有復用起來,大大降低了效率。

    因此,C++引入了模板的概念,通過模板,即可實現一份代碼交換不同數據。

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

    1.1.函數模板

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

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

    其語法為:

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

    以交換函數為例:

    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;
    }

    C++中模板和STL的示例分析

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

    C++中模板和STL的示例分析

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

    1.1.1.兩種函數模板的實例化

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

    1.隱式實例化

    讓編譯器根據實參推演模板參數的實際類型

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

    C++中模板和STL的示例分析

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

    2.顯式實例化

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

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

    C++中模板和STL的示例分析

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

    1.1.2.模板參數的匹配原則

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

    1.2.類模板

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

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

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

    以動態順序表為例:

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

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

    二、STL

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

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

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

    STL存在以下缺陷:

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

    感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++中模板和STL的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    新巴尔虎右旗| 登封市| 伊金霍洛旗| 讷河市| 阿尔山市| 阳朔县| 永济市| 南乐县| 八宿县| 邹平县| 田林县| 苗栗县| 塘沽区| 张家港市| 青州市| 荆州市| 岳阳县| 云浮市| 乐昌市| 西平县| 修武县| 武宁县| 铁岭县| 忻州市| 正定县| 疏附县| 洞口县| 昌图县| 桃园市| 道孚县| 西平县| 突泉县| 定结县| 九江县| 礼泉县| 郑州市| 奇台县| 赣州市| 隆子县| 乌兰察布市| 蓝田县|