從零開始的C++(二十一)

C++11

1.列表初始化:

//允許以下代碼正確運行int a[]{1,2,3};//效果與int a[]={1,2,3}一致

即允許省略等于號。同時,允許用花括號對所有自定義類型和內置類型進行初始化,而非以前花括號只能對數組進行初始化。利用花括號對自定義類型初始化時,相當于調用了其構造函數。

2.std::initializer_list

一般用作構造函數的參數,接受一系列的初始值,并以此賦給每個對象。

因此,允許以下操作:


map<int,string>v={{1,"one"},{2,"two"}};
//其中{1,"one"}和{2,"two"}均對應一個pair<int,string>的對象,用于給map賦值。

3.decltype

可以獲得變量的類型,并且可以用這個類型構造變量(與typeid不同,typeid只能得到類型,不能用來定義變量)

4.右值引用

左值:可以取地址的表達式,因為可以取地址因此可以給其賦值,所以可以出現"="的左右任意一側。對左值進行引用,就是給其取個別名,稱為左值引用。

右值:不可以取地址的表達式,無法給其賦值,因此只能出現在"="右側,對右值進行引用,稱為右值引用。常見的右值有表達式返回值、常量、函數返回值(返回非左值引用的類型才行)。

需注意,右值不能取地址,無法給其賦值,但是,右值引用后會有一份地址保存這個值,就可以通過這個地址對其進行修改。若不希望被修改,就用const修飾右值引用。

左值引用與右值引用區別:

左值引用:正常只能引用左值,用const修飾可以引用左值和右值

右值引用:正常只能引用右值,但是給左值加move可以被右值引用

int i=1;
int &&a=move(i);  //此處i是左值,但move(i)返回的是右值

右值引用應用:

常用于函數返回臨時對象時,此時無法返回左值引用,因為變量是出了函數作用域就銷毀的。若不用右值引用,則正常需要進行兩次深拷貝(編譯器可能優化成一次),但右值引用可以不進行深拷貝,極大提高了效率。

而右值引用的原理是,認為臨時對象出了作用域就要被銷毀,因此可以直接拿過來臨時對象的成員,這樣就不用進行深拷貝了。這就是移動構造的思想。

同時,也有移動賦值,函數參數是右值引用,原理也是直接交換對象的成員,而非深拷貝。

5.完美轉發:

用于有萬能模版的情況下。而萬能模版就是一種特殊的模版函數,其成員是T&&val,此時可以接受左值引用也可以接受右值引用,因此是萬能模版。而無論是左值引用還是右值引用,其類型都是左值(注:是右值引用是左值,不是右值是左值!),因此,若用右值引用做參數,只能調用以左值引用為形參的函數,無法調用以右值為形參的函數,若想要調用只能用move,但這樣就只能調用右值引用為參數的。為了實現左值引用可以調用左值為參數的函數,右值引用可以調用右值為參數的函數,在引用前加一個forward,效果是右值引用則返回一個右值,左值引用就返回一個左值。

6.默認成員函數的增加:

增加了默認移動構造和默認移動賦值構造,編譯器自己寫默認移動構造函數的前提是:

1.用戶自己未編寫移動構造

2.用戶為編寫拷貝構造、賦值構造和析構函數。

使用:對于內置類型進行逐字節拷貝,對于自定義類型若有移動構造調用移動構造,若沒有調用拷貝構造。

(對于默認移動賦值前提和使用極其類型,就是把移動構造改成移動賦值即可)

7.強制生成/銷毀默認成員函數:

強制生成:default;? ? 強制銷毀:delete? ? 一般稱=delete的函數是刪除函數

class bb
{public:bb()=default;//強制生成bb(const bb&b)=delete;//強制刪除}

8.可變參數模版:

寫法:

template<class...Args>

返回類型 函數名(Args...args)

{?

//函數體

}

args前面有...,是可變模版參數。稱前面有...的參數為參數包,參數包里包含0到N個可變模版參數。

如何獲取參數包里的可變模版參數:

1.用遞歸展開:

void _get()
{cout<< endl;
}template<class T,class...Args>
void _get(T& val,Args...args)
{cout << val << " ";_get(args...);
}template<class...Args>
void get(Args...args)
{_get(args...);
}int main()
{get(1, 2.2, "xxx");
}

原理就是不斷用T獲取最左的那個可變模版參數,然后不斷縮小參數包內的可變模版參數的個數,最后當可變模版參數為0時調用打印空格,實現獲取所有的參數。

2.利用逗號表達式:

template<class T>
void print(T& val)
{cout<< val << " ";
}template<class...Args>
void get(Args...args)
{//_get(args...);int a[] = { (print(args),0)... };cout << endl;
}

原理是利用初始化列表展開成(print(args1),0)、(print(args2),0)...,同時利用逗號表達式依次去執行每個()內的兩條表達式,實現獲取每個參數。

9.lambda表達式

形式:

[]+()+mutable+->+{};

其中:

[]:捕捉列表,包含在于lamabda相同作用域內的變量.[var]表示捕獲變量var。[=]表示捕獲父作用域內所有變量。[&var]表示捕獲var變量的引用。[&=]表示父作用域所有變量的引用。[this]表示捕獲當前的this指針。[]內可以包含多鐘類型的捕捉,比如[&var1,var2,this],但注意相同變量不能重復捕獲。

():函數參數列表,若無參數可以省略

mutable:若無mutable則表示該lambda函數是const修飾的函數,若有則可以取消常量性。注:若加上mutable,則參數列表無論有無參數都得寫"()"。

->:指向返回類型,若返回類型是空可以省略,若返回類型十分明確也可以省略讓編譯器自動推導。

{}:函數體部分。

ps:只有[]和{}部分一定不能省略

lambda的底層代碼是仿函數,若想要用一個變量接受該表達式,則需要用auto修飾變量,因為lambda返回的類型由編譯器自己決定,無法顯示知道并調用。

10.包裝器:

頭文件是<functional>

function<返回類型(函數參數)>對象={}。

作用:可以讓對象賦值為仿函數、函數形參、lambda函數(但返回類型和函數參數必須相同)

(注:當接受的是lambda函數時,不管[],只要()和返回類型一致就行)

11.bind:

類型一個函數模版。功能是接受一個可調用對象,返回一個新的可調用對象去適應原本的函數參數,如修改函數參數的先后順序和個數。

使用:

auto newcallable=bind(callable,arg_list),其中newcallable是新生成的可調用對象,callable是原可調用對象,arg_list是一個逗號表達式,包含callable的參數。

arg_list:可以是placeholder::_x,表示當前位置對應函數第x個參數。

如上圖,newf中1對應的是placeholder::_2,故對應lambda的第二個函數參數b。

arg_list也可以是一個固定變量或常量,表示該位置是一個固定的函數參數,一般用于某個調用的參數固定不變的情況。

如上圖,第一個參數a對應的位置為常量111,此時調用時就不需要在顯示寫該參數了,因此newf調用時只寫了一個參數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209974.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode刷題--- 求根節點到葉節點數字之和

個人主頁&#xff1a;元清加油_【C】,【C語言】,【數據結構與算法】-CSDN博客 個人專欄&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;這個專欄主要講述遞歸遞歸、搜索與回溯算法&#xff0c;所以下面題目主要也是這些算法做的 我講述…

【ITK庫學習】使用itk庫進行圖像濾波ImageFilter:鄰域濾波

目錄 1、itkMeanImageFilter 均值濾波器2、itkMedianImageFilter 中值濾波器3、itkBinaryMedianImageFilter 二值中值濾波器4、擴展itkNeighborhood5、擴展itkNeighborhoodIterator6、擴展itkNeighborhoodOperator 領域濾波是一種信號處理方法&#xff0c;用于去除信號中的噪聲…

★560. 和為 K 的子數組(自己做出來了)

560. 和為 K 的子數組 前綴和的知識。 如果要求i~j下標之間的元素和&#xff0c;用前綴和的話&#xff0c;應該是b[j] - b[i-1]&#xff0c;i處的值也應該包括。 所以這個題&#xff0c;前綴和數組就要比原數組整體向后平移一個單元格&#xff0c;不然在求0~n的和的時候沒法取…

在python中安裝庫,會有conda安裝,也會有pip安裝,conda與pip的區別是什么?

文章目錄 一、Conda是什么&#xff1f;二、pip是什么&#xff1f;三、pip與conda的區別&#xff1a;總結 一、Conda是什么&#xff1f; Conda是一個開源的包管理系統&#xff0c;它是Anaconda公司為Python和其他編程語言開發的。它主要用于數據科學和機器學習領域&#xff0c;…

【Vue】日常錯誤總結(持續更新)

日常遇到的小問題匯總, 內容小篇幅少的就全放這里了, 內容多的會在Vue專欄單獨分享~ 目錄 【Q】 el-form-item值為 null 或 undefined顯示““ 【Q】dialog內組件數據刷新總是延遲慢一拍 問題背景描述 解決方案 代碼簡單模擬 JS 【Q】el-input 不能輸入的解決辦法 方法…

Educational Codeforces Round 156 (Rated for Div. 2)補題

Sum of Three 題目大意&#xff1a;將一個正整數n分成3個不同的正整數x,y,z,保證三個數都不能整除3&#xff0c;如果無法實現就輸出NO. 思路&#xff1a;這個題實際上特別簡單&#xff0c;我們可以發現當n比較大的時候&#xff0c;我們可以從中取1&#xff0c;然后第二個數也…

【Java】Java環境以及EditPlus編輯器安裝與配置流程

要安裝和配置Java環境以及EditPlus編輯器&#xff0c;請按照以下步驟操作&#xff1a; ### 安裝Java Development Kit (JDK) 1. 訪問Java官方網站下載最新版本的JDK。 2. 運行下載的JDK安裝程序&#xff0c;并按照提示完成安裝。 3. 安裝完成后&#xff0c;記下JDK的安裝路徑&a…

perf與火焰圖-性能分析工具

參考鏈接 perf性能分析工具使用分享 如何讀懂火焰圖&#xff1f;-阮一峰 perf基本用法-record,report-知乎 火焰圖抓取 準備&#xff1a; centos安裝perf工具 dnf install perf下載火焰圖解析代碼 git clone https://github.com/brendangregg/FlameGraph.git抓取指定進程…

Orcal數據庫Schema理解、表分區理解

目錄 1 Schema1.1 Orcal數據庫示例1.2 MySQL數據庫示例 2 Orcal表分區2.1 創建表分區2.2 查看表分區2.3 查看指定分區數據 此前未了解過Schema的概念&#xff0c;僅知道Orcal數據庫比較側重這個概念&#xff0c;搜遍全網都&#xff0c;都是啰哩吧嗦的搬抄定義&#xff0c;特此在…

LeetCode算法題解(單調棧)|LeetCode503. 下一個更大元素 II、LeetCode42. 接雨水

一、LeetCode503. 下一個更大元素 II 題目鏈接&#xff1a;503. 下一個更大元素 II 題目描述&#xff1a; 給定一個循環數組 nums &#xff08; nums[nums.length - 1] 的下一個元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每個元素的 下一個更大元素 。 數字 x 的…

LIMoE:使用MoE學習多個模態

文章鏈接&#xff1a;Multimodal Contrastive Learning with LIMoE: the Language-Image Mixture of Experts 發表期刊&#xff08;會議&#xff09;: NeurIPS 2022 目錄 1.背景介紹稀疏模型 2.內容摘要Sparse Mixture-of-Experts ModelsContrastive LearningExperiment Analy…

Kubernetes入門筆記 ——(3)理解pod對象

為什么需要pod 最為熟知的一句話&#xff1a;pod是k8s的最小調度單位。剛開始聽到這句話時會想&#xff0c;已經有容器了&#xff0c;k8s為什么還要搞個pod出來&#xff1f;容器和pod是什么關系&#xff1f;容器的本質是進程&#xff0c;而k8s本質上類似操作系統。 熟悉Linux的…

SpringBoot系列之啟動成功后執行業務的方法歸納

SpringBoot系列之啟動成功后執行業務邏輯。在Springboot項目中經常會遇到需要在項目啟動成功后&#xff0c;加一些業務邏輯的&#xff0c;比如緩存的預處理&#xff0c;配置參數的加載等等場景&#xff0c;下面給出一些常有的方法 實驗環境 JDK 1.8SpringBoot 2.2.1Maven 3.2…

python dataframe 列中 字符串( ‘2815512706605‘)過大 轉不了float 用Decimal

from decimal import Decimaldf["accFillSz"] df["accFillSz"].apply(lambda x: Decimal(x)) 2815512706605這個值超出了Python中float類型的最大表示范圍,無法直接轉換為浮點數。 Python中float類型使用IEEE 754標準的64位雙精度浮點數表示,最大值大約為…

歐拉回路歐拉路【詳解】

1.引入 2.概念 3.解決方法 4.例題 5.回顧 1.引入 經典的七橋問題 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含兩個島嶼及連接它們的七座橋&#xff0c;如下圖所示。 可否走過這樣的七座橋&#xff0c;而且每橋只走過一次&#xff1f; 你怎樣證明&#xff1f;…

【Linux top命令】

文章目錄 深入了解Linux top命令&#xff1a;實時監控系統性能1. 什么是top命令&#xff1f;2. 使用top命令3. top命令交互操作 深入了解Linux top命令&#xff1a;實時監控系統性能 1. 什么是top命令&#xff1f; top命令是一個用于實時監控系統性能的文本界面工具。它顯示當…

Linux上使用獨立顯卡Tesla T4(測試視頻壓縮)

背景 將視頻處理程序單獨部署至K8S之外&#xff0c;使用獨立GPU顯卡的一臺服務器上。 需事先對GPU性能做簡單測試。 已通過zabbix對Linux進行了系統資源監控。 已通過PrometheusGrafana對顯卡Tesla T4做了性能監控。 逐步補充&#xff0c;稍等 2023年12月6日 操作 查看當前…

鴻蒙Harmony開發初探

一、背景 9月25日華為秋季全場景新品發布會&#xff0c;余承東宣布鴻蒙HarmonyOS NEXT蓄勢待發&#xff0c;不再支持安卓應用。網易有道、同程旅行、美團、國航、阿里等公司先后宣布啟動鴻蒙原生應用開發工作。 二、鴻蒙Next介紹 HarmonyOS是一款面向萬物互聯&#xff0c;全…

[Linux] 基于LAMP架構安裝論壇

一、安裝Discuz論壇 1.1 創建數據庫&#xff0c;并進行授權 mysql -u root -p123CREATE DATABASE bbs; #創建一個數據庫GRANT all ON bbs.* TO bbsuser% IDENTIFIED BY admin123; #把bbs數據庫里面所有表的權限授予給bbsuser,并設置密碼admin123flush privileges; #刷新數據庫…

Java 中的抽象類與接口:深入理解與應用

文章目錄 什么是抽象類&#xff1f;什么是接口&#xff1f;抽象類和接口的使用場景抽象類和接口的區別結論 在 Java 編程語言中&#xff0c;抽象類和接口是兩種重要的機制&#xff0c;用于實現抽象化和多態性。這兩種機制都允許我們定義一種通用的類型&#xff0c;然后通過繼承…