【C++練級之路】【Lv.21】C++11——列表初始化和聲明



快樂的流暢:個人主頁


個人專欄:《算法神殿》《數據結構世界》《進擊的C++》

遠方有一堆篝火,在為久候之人燃燒!

文章目錄

  • 引言
  • 一、列表初始化
    • 1.1 內置類型
    • 1.2 結構體或類
    • 1.3 容器
  • 二、聲明
    • 2.1 auto
    • 2.2 decltype
    • 2.3 nullptr
  • 三、STL的變化
    • 3.1 新增容器
    • 3.2 新增initializer_list構造
    • 3.3 新增移動構造、移動賦值和移動插入
    • 3.4 其他

引言

關于C++11的auto、nullptr和范圍for的知識,在之前已經提到過,這里不再贅述,有需要的請移步這篇博客【C++練級之路】【Lv.1】C++,啟動!(命名空間,缺省參數,函數重載,引用,內聯函數,auto,范圍for,nullptr)

一、列表初始化

C++11更新后,一切皆可用列表初始化。列表初始化,又稱統一初始化,具體使用{}進行初始化。

列表初始化,沿襲C語言對于內置類型和結構體的初始化上,進行了統一形式的擴展。

1.1 內置類型

void test()
{//單一變量int i = 0;int j = { 0 };int k{ 0 };//數組int arr1[] = { 1,2,3 };int arr2[5]{ 0 };//動態開辟int* ptr1 = new int[5] {0};
}

雖然內置類型(如 int, double 等)通常不需要列表初始化,但列表初始化仍然允許。列表初始化的一個特點,就是可以去除等號“=”。

1.2 結構體或類

struct Point
{int _x, _y;
};class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}
private:int _year, _month, _day;
};void test()
{//結構體Point p1 = { 3,5 };Point p2{ 4,6 };//類Date d1(2024, 4, 10);Date d2 = { 2024,5,1 };Date d3{ 2024,6,1 };//動態開辟Date* ptr2 = new Date[3]{ d1,d2,d3 };Date* ptr3 = new Date[3]{ {2024,1,1},{2024,2,2},{2024,3,3} };
}

對于類的列表初始化,可以理解為隱式類型轉換構造臨時對象->拷貝構造->編譯器優化為直接構造

1.3 容器

void test()
{vector<int> v1 = { 1,2,3 };vector<int> v2 = { 1,2,3,4,5 };map<string, string> dict = { {"排序","sort"},{"逆序","reverse"} };
}

對于容器的列表初始化,可不是之前的類型轉換,因為此時初始化的列表是可以變長的,而之前的多參數構造是固定長度的。


那么,此時應該怎么理解容器的列表初始化呢?其實,這里涉及了STL庫中的initializer_list類。

void test()
{auto il = { 1,2,3,4,5 };cout << typeid(il).name() << endl;initializer_list<int>::iterator it = il.begin();while (it != il.end()){cout << *it << " ";++it;}cout << endl;for (auto e : il){cout << e << " ";}cout << endl;
}

由上述代碼可知,讓編譯器自動推導列表類型,便是class std::initializer_list< int >。同樣的,initializer_list類也有自己的迭代器,可以用迭代器進行遍歷和修改。


那么,每次容器的列表初始化過程可以理解為:將右側構造為initializer_list ->遍歷initializer_list,進行迭代器區間構造

  1. 構造initializer_list的過程:在常量區找到列表中的值,用兩個指針start和finish指向頭部和尾部的下一位(類似于vector的內部原理)
  2. 每個容器都添加了initializer_list的構造函數,調用對應的構造函數,運用迭代器區間進行容器構造

ps:容器既有initializer_list的構造,也有initializer_list的賦值

二、聲明

C++11提供了多種簡化聲明的方式,尤其是在使用模板時。

2.1 auto

2.2 decltype

關鍵字decltype可將變量的類型聲明為表達式指定的類型

void test()
{int x = 1;double y = 2.0;decltype(x) k;auto ret = x * y;vector<decltype(ret)> v;
}

decltype最大的作用,便是用來定義模板參數。因為auto沒辦法作為模板參數,所以decltype正好彌補了這方面的缺陷。

2.3 nullptr

三、STL的變化

3.1 新增容器

C++11更新了四個容器,分別是array,forward_list,unordered_set,unordered_map。其中unordered_set,unordered_map,我們已經深入學習和模擬實現過了。

那么,關于array和forward_list,其實帶來的提升較小,實際中較少用到。

  • array:array是一個固定大小的容器,它在編譯時就知道自己的大小,這使得它在性能上通常優于vector,因為它不需要在運行時進行動態內存分配和大小調整。

  • forward_list:forward_list是一個單向鏈表,它只包含指向下一個元素的指針,沒有指向前一個元素的指針。這使得它在內存使用上比list(雙向鏈表)更高效。

3.2 新增initializer_list構造


這點在先前列表初始化已經提到過,這是一個非常有用的提升與變化,initializer_list的引入使得 C++ 的初始化語法更加簡潔、直觀和靈活,提高了代碼的可讀性和可維護性。

3.3 新增移動構造、移動賦值和移動插入

這是非常重要的提升,可以大大提高效率。具體內容要等講到右值引用和移動語義時會詳細講解。

3.4 其他

還比如提供了cbegin和cend方法返回const迭代器等等,但是實際意義不大,因為begin和end也是可以返回const迭代器的,這些都是屬于錦上添花的操作。


真誠點贊,手有余香

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

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

相關文章

A*算法搜索的路徑是最優的么?

A * 算法&#xff08;A* Search Algorithm&#xff09;是一種啟發式搜索算法&#xff0c;它旨在找到從起點到終點的最短路徑。在滿足以下條件時&#xff0c;A*算法能夠保證找到最優路徑&#xff1a; 啟發式函數的一致性&#xff08;Consistency&#xff09;或可采納性&#xf…

從“反超”到“引領”,中國衛浴品牌憑何遙遙領先?

作者 | 曾響鈴 文 | 響鈴說 前不久&#xff0c;第28屆中國國際廚房、衛浴設施展覽會(以下簡稱“中國國際廚衛展”)在上海如期舉行&#xff0c;就結果來說真的讓人大開眼界。 沖水聲比蚊子聲更小的馬桶、能化身無感交互平臺的魔鏡柜、可以語音交互的淋浴器&#xff0c;這些“…

Keli5燒寫STM32程序時出現ST-LINK USB communication error錯誤(USB 通信錯誤)

1錯誤原圖 2錯誤原因 前提驅動安裝正確 原因1 usb接觸不良&#xff08;極少出現&#xff09; 解決方法 更換USB線 還不行連下載器一起更換 原因2&#xff08;出現概率比較大&#xff09; 下載器的固件出現問題或下載器固件版本與Keli5的版本不匹配 解決方法 在Keli5的…

[音視頻]ffmepg常用命令

ffmpeg 在音視頻的世界里&#xff0c;ffmpeg可是如雷貫耳的存在&#xff0c;學習音視頻開發&#xff0c;ffmpeg是必須掌握的技能 常用命令 保存m3u8文件 ffmpeg -i http://xxxxx/test.m3u8 -c copy result.mp4

今日早報 每日精選15條新聞簡報 每天一分鐘 知曉天下事 5月26日,星期日

每天一分鐘&#xff0c;知曉天下事&#xff01; 2024年5月26日 星期日 農歷四月十九 1、 醫保局&#xff1a;支持將符合條件的村衛生室納入醫保定點&#xff0c;方便農村居民就醫。 2、 網傳養老金儲備嚴重不足&#xff1f;央視辟謠&#xff1a;這筆錢二十多年來從未動用過&a…

搭建企業級AI應用的流程

搭建企業級AI應用的流程是一個復雜且系統化的工程&#xff0c;它需要從多個維度出發&#xff0c;確保最終的應用既符合企業的業務需求&#xff0c;也具備高效、穩定和可擴展的特性。以下是詳細的步驟&#xff1a; 初步接觸與需求分析是整個項目的基礎。在這一階段&#xff0c;我…

【C++題解】1698. 請輸出帶有特殊尾數的數

問題&#xff1a;1698. 請輸出帶有特殊尾數的數 類型&#xff1a; 題目描述&#xff1a; 請輸出1~n 中所有個位為 1、3、5、7中任意一個數的整數&#xff0c;每行 1 個。( n<1000 ) 比如&#xff0c;假設從鍵盤讀入 20&#xff0c;輸出結果如下&#xff1a; 1 3 5 7 11 1…

LLMs之PEFT之Llama-2:《LoRA Learns Less and Forgets LessLoRA學得更少但遺忘得也更少》翻譯與解讀

LLMs之PEFT之Llama-2&#xff1a;《LoRA Learns Less and Forgets LessLoRA學得更少但遺忘得也更少》翻譯與解讀 導讀&#xff1a;該論文比較了LoRA與完全微調在代碼與數學兩個領域的表現。 背景問題&#xff1a;微調大規模語言模型需要非常大的GPU內存。LoRA這一參數高效微調方…

OpenStack平臺Keystone組件的使用

1. 規劃節點 安裝基礎服務的服務器規劃 IP地址 主機名 節點 192.168.100.10 controller Openstack控制節點 2. 基礎準備 使用機電云共享的單節點的openstack系統&#xff0c;自行修改虛擬網絡編輯器、網絡適配器&#xff0c;系統用戶名&#xff1a;root&#xff0c;密…

【Basic】Upload-Labs-Linux

文章目錄 前言Pass-01Pass-02Pass-03Pass-04Pass-05Pass-06Pass-07Pass-08Pass-09Pass-10Pass-11Pass-12Pass-13Pass-14Pass-15Pass-16解題感悟 前言 美好的一天從刷題開始 Pass-01 我淦20道題&#xff1f;&#xff1f;&#xff1f;一道一道來吧 先看第一道題 先在home里搞一…

原生標簽WebComponent

文章目錄 介紹一、web Component二、怎么使用三、在Vue中使用使用場景 前端必備工具推薦網站(免費圖床、API和ChatAI等實用工具): http://luckycola.com.cn/ 介紹 平常瀏覽各個網站過程中&#xff0c;經常遇到的一種現象&#xff1a;頁面廣告。 這種廣告按照來源可分為兩種&…

蜜罐技術是一種什么防御技術?實現原理是什么?

前言&#xff1a;蜜罐技術的出現改變了這種被動態勢&#xff0c;它通過吸引、誘騙攻擊者&#xff0c;研究學習攻擊者的攻擊目的和攻擊手段&#xff0c;從而延緩乃至阻止攻擊破壞行為的發生&#xff0c;有效保護真實服務資源。 自網絡誕生以來&#xff0c;攻擊威脅事件層出不窮…

簡述Vue 2.0 響應式數據的原理

Vue 2.0 響應式數據的原理主要基于以下幾個關鍵點&#xff1a; 數據劫持與Object.defineProperty&#xff1a; Vue 2.0 使用 Object.defineProperty 方法來劫持對象的屬性&#xff0c;為其添加 getter 和 setter 方法。當數據被訪問或修改時&#xff0c;這些 getter 和 setter …

類和對象【六】友元和內部類

文章目錄 友元友元的作用友元的缺點友元函數語法&#xff1a;特點&#xff1a; 友元類語法&#xff1a;特點&#xff1a; 內部類概念特點 友元 友元的作用 友元提供了一種打破封裝的方式&#xff0c;有時提供了便利。 友元的主要作用就是打破封裝 即可以讓一個類的友元函數…

爬蟲100個Python例子優化

今天看到一個Python 100例的在線資源,感覺每個都需要去點,太費時間了,于是,使用Python將數據爬取下來,方便查看。實際效果如下: 。。。。。。 用了13分鐘,當然,這是優化后的效果,如果沒有優化,需要的時間更長。 爬取url如下: https://www.runoob.com/python/pytho…

Vue小程序項目知識積累(三)

1.CSS中的var( ) var() 函數用于插入自定義屬性&#xff08;也稱為CSS變量&#xff09;的值。 var(--main-bg-color,20rpx) 設置一個CSS變量的值&#xff0c;但是如果 --main-bg-color 變量不存在&#xff0c;它將默認返回 20rpx。 CSS變量必須在一個有效的CSS規則&#xf…

uniapp+vue3+ts開發小程序或者app架構時候的UI框架選型

使用vue3tsviteuniapp開發小程序或者跨平臺app的趨勢越來越高&#xff0c;有一個順手的UI的框架還是非常重要的&#xff0c;官方維護的 uni-ui&#xff0c;支持全端&#xff0c;而且有類型提示&#xff0c;目前已經內置到 GitHub - Sjj1024/uniapp-vue3: 使用uniapp和vue3 ts …

搭建CMS系統

搭建CMS系統 1 介紹 內容管理系統&#xff08;Content Management System&#xff0c;CMS&#xff09;是一種用于管理、發布和修改網站內容的系統。開源的CMS系統有WordPress、帝國CMS等&#xff0c;國產的Halo很不錯。 WordPress參考地址 # 官網 https://wordpress.org/# …

為什么IP地址需要劃分為公有和私有地址?

一.知識點的解釋 1.在現在的網絡中&#xff0c;IP地址分為公網IP地址和私有IP地址。公網IP是在Internet使用的IP地址&#xff0c;而私有IP地址則是在局域網中使用的IP地址。 2.私有IP地址是一段保留的IP地址。只使用在局域網中&#xff0c;無法在Internet上使用。 二.為什么…

Python腳本必加代碼:99%的程序員都忽視了這個細節!

文章目錄 一、初識 if __name__ __main__二、__name__ 和 __main__ 是什么&#xff1f;三、實戰講解四、實際應用場景測試代碼提高代碼可重用性避免不必要的執行 五、深入理解和更多用法使用 argparse 解析命令行參數使用 unittest 進行單元測試使用 multiprocessing 創建子進…