日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 实现 STL 标准库和算法(二)template 编程和迭代器粗解 实验楼笔记

發布時間:2024/8/26 c/c++ 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 实现 STL 标准库和算法(二)template 编程和迭代器粗解 实验楼笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

一、template 編程和迭代器粗解

1.1 實驗內容

本節內容主要講述 c++11 模板的用法,以后的代碼中會大量的用到模板的知識。同時簡單講解迭代器的相關知識,為后面容器和算法的內容作鋪墊。

1.2 實驗知識點

  • 模板編程
    • 基本語法
    • 模板函數
    • 類模板和成員模板
    • 模板類中的靜態成員
    • typename和class
  • 迭代器
    • 迭代器詳解
    • 迭代器種類和使用
?

基本語法

模板編程是 STL 的基石,也是 c++11 的核心特性之一。模板是相對于編譯器而言,顧名思義就是向編譯器提供一個處理事務的模板,以后需要處理的東西,如果都是這個事務類型,那么統統用這個模板處理。 三、函數模板 模板的基本語法如下: template <typename/class T> template 告訴編譯器,接下來是一個模板 ,typename 和 class 都是關鍵字,在這里二者可以互用沒有區別。在< >?T?叫做模板形參,一旦模板被實例化,T?也會變成具體的類型。接下來,我們看一個例子。 ? 代碼實例: template <typename T> T add(const T lva ,const T rva) { T a ; a = lva + rva ; return a; } 這是一個模板函數的簡單實例,所有模板函數在開始都需要?template?語句,以告訴編譯器這是一個模板和參數等必要信息,當然里面的?T?可以取任意你喜歡的名字 ,模板參數個數也是任意更換的。 還要提醒的一點是:template <typename T1 ,typename T2 = int>函數模板是支持默認參數的,T1 、T2順序在默認情況下是可以任意的,不用嚴格按照從右到左的順序。 然后就是使用了,我們可以寫出add(1,2)?這樣的函數,也可以寫出add(2.5,4.6)這樣的函數,向?add?函數提供參數時,編譯器會自動分析參數的類型,然后將所有用到 T 定義的換成相對性的類型,以上的兩個函數在編譯期間會生成 int add(const int lva ,const int rva) { int a ; a = lva + rva ; return a; } double add(const double lva ,const double rva) { double a ; a = lva + rva ; return a; } 這樣的兩個具體函數。如果我們使用add(1,2.0)是會報錯的,編譯器無法找到add(int,double)。大家可以自己分析一下為什么。 ? 四、類模板和成員模板

?

類模版

c++11 不僅支持對函數的模板化,也支持對類的模板,下面來看基本的語法是怎樣的: template <class T> class Myclass { T a; public: T add(const T lva ,const T rva); }; template <class T> T Myclass<T>::add(const T lva, const T rva) { a = lva + rva; return a; } 這是一個簡單并且典型的類模板,在程序中給出模板并不能使用它,還必須實例化,比如: Myclass<int> A;?//用 int 實例化一個類A Myclass<double> B;?//用 double 實例化一個類B 當程序編譯到這里時就會按照我們給出的類型,聲明兩組類和兩組類函數。注意,在這里我們一定要顯式給出類型 T 。類模板不像是函數模板 ,函數模板會根據參數推斷類型。 當然類模板也支持默認參數,但是類模板必須嚴格從右往左默認化。

成員模板

模板的使用范圍是廣泛的,不僅可以用作函數模板,類模板,還可以用作 class ,struct ,template class 的成員。而要實現 STL 這是我們必須掌握和使用的特性。我們先看一個簡單的例子,用上面的類改編而來: template <class T> class Myclass { public: T a; template <typename type_1 , typename type_2> type_1 add(const type_1 lva ,const type_2 rva); }; template <class T> template <typename type_1,typename type_2> type_1 Myclass<T>::add(const type_1 lva, const type_2 rva) { a = lva + rva; return a; } 在類的聲明中使用了一個嵌套的模板聲明。且通過作用域運算符?::?指出 add 是類的成員,需要注意的一點,有些編譯器不支持模板成員,而有些編譯器不支持在類外定義。我們默認大家的編譯器都支持。模板如此強大,甚至允許我們在模板類中再建立模板類: template <class T> class Myclass { public: T a; template <typename type_1 , typename type_2> type_1 add(const type_1 lva ,const type_2 rva); template <class type_3> class Myclass_2; // 聲明放在這里,具體定義放在類外進行。 Myclass_2<T> C; // 定義一個Myclass_2 類 A。使用 T 進行實例化 }; template <class T> template <typename type_1,typename type_2> type_1 Myclass<T>::add(const type_1 lva, const type_2 rva) { a = lva + rva; return a; } template <class T> template <class type_3> class Myclass<T>::Myclass_2 { public: type_3 value; type_3 sub(const type_3 a , const type_3 b) {vlaue = a - b;} }; 當然我們暫時還用不到這樣復雜的東西,這里只是展現了模板的部分特性。 ? ? 五、模板類中的靜態成員 ? ? 我們知道,在類中定義的靜態成員是存儲在靜態區中,被所有類對象共享,并不屬于某一個類所有,同樣的在模板類中的靜態成員也不會被復制多份,而是被同類實例化的類對象共享,比如所有 int 和所有 double 的類對象,享有相互獨立的靜態變量。也可以說是編譯器生成了 int 和 double 兩個版本的類定義 ? 六、typename 和 class ? typenameclass是模板中經常使用的兩個關鍵詞 ,在模板定義的時候沒有什么區別。以前用的是 class,后來 c++ 委員會加入了 typename。因為歷史原因,兩個是可以通用的。對有些程序員來說,在定義類模板的時候,常常使用 class 作為關鍵字,增加代碼可讀性。其它則用 typename,上面的代碼大都遵循這樣的標準,但是并無強制規定。但是如果二者沒有差別,為什么還要加入typename呢?c++標準委員會不會增加無用的特性,讓我們來看一個例子: class Myclass{ public: Myclass(); typedef int test; //定義類型別名 } template <class T> class Myclass2{ public: Myclass2(); T::test *a // 聲明一個指向T::test類型的指針。 // typename T::test * a } 以上的代碼沒有全部寫完,大家覺得編譯器能夠過嗎?答案是不能,因為在 c++ 中,允許我們在類中定義一個類型別名,且使用的時候和類名訪問類成員的方法一樣。這樣編譯器在編譯的時候就會產生二義性,它根本不知道這是一個類型還是別名,所以我們加上 typename 顯式說明出來。當然如果這里沒有二義性,比如Myclass ::test * a?,加上 typename 是會報錯的。此外,在 class 的 STL 底層還有一個特性,用于保留模板參數,但是在 c++17 中已經舍棄,所以我們沒有講。 ? ? 七、實驗總結 ? 模板是 c++ 最重要的特性之一,模板函數、模板類、類中的模板函數、類中的模板類、模板類中的模板類等等,可以寫出太多強大的代碼,這也是模板的魅力所在,而 STL 就是基于模板的,大家一定要掌握模板的基本用法。 引用《c++ primer》, 《STL 源碼解析》 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

轉載于:https://www.cnblogs.com/hx97/p/11192953.html

總結

以上是生活随笔為你收集整理的C++ 实现 STL 标准库和算法(二)template 编程和迭代器粗解 实验楼笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。