C 17 新特性梳理

2021-10-02 21:10:55 字數 1471 閱讀 1139

目錄

if init表示式

structual bindings

inline變數

std::string_view

c++17語言引入了乙個新版本的if/switch語句形式,if (init; condition)switch (init; condition),即可以在ifswitch語句中直接對宣告變數並初始化,如下:

if(const auto it = mystring.find("hello"); it != string::npos) 

if(const auto it = mystring.find("world"); it != string::npos)

如此一來,val僅在ifelse中可見,不會洩漏到其他作用域中去了。switch也支援initializatioin

典型場景如下:

// 1 結構體和陣列

struct mystruct ;

mystruct getstruct() ;

}auto [id, val] = getstruct(); // id = i, val = s

//陣列也適用

int arr = ;

auto [x, y] = arr;

// 2 簡化map的使用

for (const auto& elem: my_map)

for (const auto& [key, val]: my_map)

// 3 簡化tuple

tuplefunc();

//before c++17

auto tup = func();

int i = get<0>(tup);

string s = get<1>(tup);

//or

int i;

string s;

std::tie(i, s) = func();

//c++17

auto [ i, s ] = func();

c++11支援類體內初始化, 但是只能是const成員, 非const只能放在class外

c++17後, 通過inline支援類體內初始化, 可以更好的支援head-only

struct myclass ;

std::string呼叫sub_str()的時間複雜度是o(n);

sts::string_view呼叫sub_str()的時間複雜度是o(1);

參考:

總結目前來看更多的是語法糖,尚需進一步的學習。

主要參考:

C 17 之 新的 初始化規則

c 11 引入列表初始化,即使用的方式對聚合型別進行初始化.聚合型別在 iso iec14882 2017 11.6.1 描述,表示陣列或類 c 11 的列表初始化規則,在與 auto 聯合使用時經常無法達到程式設計師的期望並出錯,因此 c 17 對列表初始化規則進行增強.在使用具體資料型別 不需要...

C 17 之 結構繫結

注意 結構繫結 structured binding 位於iso iec14882 2017 11.5 節.結構繫結的作用是方便從其它資料結構中提取資料,如 pair,tuple,陣列等.通過結構繫結,可以替代 c 17 之前的 std tie,並且使用更加方便.通用的宣告方式為 auto v1,v...

c (17)一 二兩章回顧

前些天基本上每天都會花一兩個小時看書,系統的學習c 內容,彌補之前不足之處。經過了一段時間之後,已經看了兩章內容了,又一些內容是之前早就會的,當然也有一部分是自己新學到的,還有一部分是c 11新規定的內容。為了避免出現學完忘光的情況,沒過一段時間我會回顧之前所學,加深印象。今天早上的時候,回頭看了第...