STL

来源:http://www.cnblogs.com/Kernel001/archive/2017/10/17/7684635.html
-Advertisement-
Play Games

模板和標準模板庫(STL) 一、模板的起源 變數四要素:類型、名稱、值、地址 數據類型:存儲形式、編碼格式、運算規則、訪問方式 int a = 0; // 補碼 float b = 0; // 階碼 char c = 'A'; // ASCII char_t d = 'A'; // UCS 4 in ...


模板和標準模板庫(STL) 一、模板的起源 變數四要素:類型、名稱、值、地址 數據類型:存儲形式、編碼格式、運算規則、訪問方式 int a = 0; // 補碼 float b = 0; // 階碼 char c = 'A'; // ASCII char_t d = 'A'; // UCS-4 int i = 0; i++; cout << i << endl; // 1 int* j = (int*)0; j++; cout << (int)j << endl; // 4 class Student ; Student stu (...); stu.m_name = ...; Student* pstu = &stu; pstu->learn (...); 靜態類型:由編譯器在編譯源代碼的過程中,處理有關數據類型的檢查、指令等問題,並將處理結果直接反應在所生成的二進位機器指令中。

Python

i = 10 i = 1.2 i = 'Hello, World !' 靜態類型的優點:運行性能好,安全。 靜態類型的缺點:缺乏靈活性,不具備泛型能力。 代碼:typed.cpp 藉助於帶參巨集(巨集函數)可以在某種程度上規避源自靜態類型系統的限制,但同時也因為類型檢查和轉換的缺少而引入潛在的風險。 代碼:untyped.cpp 通過巨集描述類型無關演算法的框架,藉助預處理器自動生成針對不同數據類型的具體版本,達到類型安全和類型無關的效果。 代碼:macro.cpp 顯示擴展巨集,預處理器缺乏類型分析能力。 巨集的調試非常困難。 二、函數模板 1.定義 template<typename 類型形參1, typename 類型形參2, ...> 返回類型 函數模板名 (調用形參表) { 函數體 } 在函數模板的返回類型、調用形參表乃至函數體中都可以引用該函數模板的類型形參。 template<typename A, typename b, typename _C> A fun (b arg) { _C var; ... } 2.使用 函數模板名<類型實參1, 類型實參2, ...> (調用實參表); 當編譯器"看到"以上調用語句,就會用尖括弧中的類型實參表與所調用函數模板尖括弧中的類型形參表,按照從前到後,依次結合,把模板化的函數編成一個具體函數,編譯成二進位機器指令,滿足調用的需要。這個過程就叫做函數模板的實例化。 代碼:ftmpl.cpp 3.類型參數 1)類型形參:必須用typename/class關鍵字修飾,而且必須其名稱必須是合法的標識符。 2)類型實參:既可以是基本類型,也可以是標準庫、第三方庫、或者開發者自己編寫的類類型,唯一的條件就是必須滿足函數模板內部實現的需要。 代碼:targ.cpp 4.延遲編譯 在構建過程中一個非模板函數,只被編譯一次,而且是在其定義被編譯器發現的時候。 在構建過程中一個模板函數,至少要經歷兩次編譯過程,第一次是在其定義被編譯器發現時,這時編譯器會對該函數模板做與類型無關的語法檢查,而後會在其內部生成關於該函數模板的內部表示;第二次是在其調用語句被編譯器發現時,這時編譯器會將調用語句所提供的類型實參與內部表示中的類型形參結合,做與類型相關的語法檢查,而後將該函數模板以具體函數的形式編譯成二進位機器指令。 代碼:typename.cpp 5.隱式推斷 如果函數模板調用參數(圓括弧里的參數)的類型相關於該模板的模板參數(尖括弧里的參數),即使不顯式指定模板參數的類型,編譯器也可以根據函數調用虛實參數類型匹配的原則,隱式推斷出模板參數的實際類型,這就叫函數模板類型參數的隱式推斷。但是,如果隱式推斷的類型與代碼編寫者所期望的類型不一致,可能產生未定義的後果。 代碼:deduction.cpp 6.重載 函數模板和普通函數一樣,也可以構成重載關係,二者區別在於,對重載版本的解析,如果是函數模板,在類型匹配程度相當的情況下,編譯器並不會立即以歧義為由報錯,相反會進一步檢查不同重載版本的類型針對性,並優先選擇針對性較強的版本。 代碼:overload.cpp 三、類模板 如果一個類的成員變數、成員函數、成員類型乃至基類中包含參數化的類型,那麼這個類就是一個類模板。 1.定義 template<typename 類型形參1, typename 類型形參2, ...> class 類模板名 [: 繼承方式 基類, ...] { 成員變數 成員函數 成員類型 }; 其中成員變數、成員函數、成員類型、基類都可以引用該類模板的類型參數。 class X ; class A : public X ; class B : public X ; class C : public X ; template

3.靜態成員變數 語法:需要用static關鍵字聲明,在類外定義初始化。 邏輯:類的一部分而非對象的一部分,被類的所有對象共用。 物理:存在進程的靜態存儲區(DAT/BSS)。

類型:主詞,副詞,飾詞 int const* p ...; static/auto/register

類模板中的靜態成員變數,是該類模板的每個實例化類的一部分,在該實例化類被實例化為對象時,被這些對象共用。 / X -> x1, x2, x3 A - Y -> y1, y2, y3 s \ Z -> z1, z2, z3 代碼:static.cpp 4.容器 通過數組存放多個類型相同的數據 int a = 10, b = 20; a = b; cout << a << endl; // 20 void foo (int a) { ++a; } foo (a); cout << a << endl; // 20 int bar (void) { int c = 30; return c; } c = bar (); cout << c << endl; // 30

int a[] = {10}, b[] = {20}; a = b; // ERROR void foo (int a[1]) { ++a[0]; } foo (a); cout << a[0] << endl; // 11

int* bar (void) { int c[] = 30; return c; } int* c = bar (); cout << c << endl; // 30? 數組容器 遞歸實例化:用一個類模板的實例化類實例化該類模板自身,以獲得在空間上具有遞歸特征的數據結構。 代碼:array.cpp 嵌套實例化:用一種數據結構的模板實例實例化另一種數據結構的模板實例,以獲得空間上的複合結構。 template p = &i; // p -> i int* q = p; // q __/ smart_ptr


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡述 寫這個工具主要目的在於減少工作量,bear在寫gitbook的時候,發現對應目錄一個一個寫進去,非常繁瑣,而且最近在學習python,所以,手癢之下寫了一個目錄生成的小工具。 工具使用 本身工具並不複雜,主要實現功能接受一個github中的raw版本的url,然後列印自動生成對應文件的mark ...
  • 本節內容 - 使用nm查看符號 - 使用readelf -s輸出符號信息 - 刪除符號表對反彙編的影響 - 使用strip刪除符號和調試信息 - 使用UPX壓縮並保護可執行文件 ...
  • spring boot / cloud (十九) 併發消費消息,如何保證入庫的數據是最新的? 消息中間件在解決非同步處理,模塊間解耦和,和高流量場景的削峰,等情況下有著很廣泛的應用 . 本文將跟大家一起討論以下其中的異常場景,如題. 場景 在實際工作中,大家可能也都遇到過這樣的需求 : 如 : 系統A ...
  • /p 問題描述 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用電腦生成了N個1到1000之間的隨機整數(N≤100),對於其中重覆的數字,只保留一個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 ...
  • 一、CURL小結 個人將歸納curl請求總結成三步 1、創建curl 句柄(curl_init),並設置參數(curl_setopt)(打開冰箱) 2、執行請求(curl_exec),處理返回的數據 (把大象塞進去) 3、關閉curl(curl_close),釋放所有資源(關上冰箱) 其實如果代碼看 ...
  • JavaWeb筆記 一、servlet 真正helloServlet所在的位置 HelloServlet.java package net.zixue.servlet; import jdk.nashorn.internal.runtime.arrays.IteratorAction; import ...
  • 一、序 畢業已經兩年了,曾經在學校學習的知識早已還給老師了,已經很久沒有好好學習了。雖然曾經也是高收入群體,但是因為從此再也不寫代碼了,覺得人生都沒有樂趣了,所以果斷離職了.....但是看著身邊越來越多的技術大牛和高收入人群和之前對比落差太大,心中未免有些不甘,所以重新撿起被遺忘的知識。曾子曰:“吾 ...
  • 1 ''' 2 生成器都是迭代器,迭代器不一定是生成器 3 ''' 4 5 # list1 = [1,2,3,4,5] 6 # p1 = iter(list1) # 等價於__iter__() 7 # print(p1) 8 # print(next(p1)) 9 # print(next(p1))... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...