C C 11特性 模板推導和迴圈區間

2021-07-23 08:52:19 字數 1961 閱讀 1048

c++11在template程式設計的領域有很大的更新,功能愈發強大了,引入變參模板、外部模板等新功能,大大增強了模板程式設計的能力,其中新特性tuple元組使用了變參模板特性。其中用的最多的,是模板推導。對於一些已經明確知道是什麼型別的變數,c++11允許我們用auto關鍵字來自動推導型別,decltype來獲取變數型別:

auto i = 10.0;//定義時即可知道是什麼型別

decltype(i) b = 2.0;//delctype獲取變數的型別

auto func=();

template

auto foo2(lhs &lhs, rhs &rhs)->decltype(lhs+rhs)//c++11模板函式返回值推導

在前c++11版本中,函式的返回值是無法推導的。c++11中函式的返回值推導**中,decltype裡面的變數必須是已經定義的變數,函式體內部的變數是不能使用的。一旦函式體很大變數多,返回值推導就不好用。c++14計畫直接使用auto關鍵字來推導模板函式返回值。

下面的**是錯誤的:

auto func=();

decltype(func) func1;//錯誤,沒有建構函式。

template

auto foo2(lhs &lhs, rhs &rhs)//c++14才會支援

template

r foo2(lhs &lhs, rhs &rhs)//不支援函式返回值型別推導

值得注意的是,auto是在程式猿明確知道物件型別的情況下偷懶用的。如果程式猿都沒搞清楚具體的型別是什麼,那麼用auto出bug的機率非常大。

在python中,容器的迴圈遍歷寫作:for iter in vector,其中in是關鍵字。c++由於用途廣泛,像in這樣的關鍵字早已被當做普通變數名用了無數次,因此c++11用如下方式來迴圈遍歷容器:

std::vector

a = ;

std::vector

::iterator beg = a.begin();

std::vector

::iterator end = a.end();

for(; beg != end; ++beg) cout

<< *beg << " ";//傳統用法

cout

<< endl;

auto iter1 = std::begin(a);

auto iter2 = std::end(a);

for(; iter1 != iter2; ++iter1) cout

<< *iter1 << " ";//非成員begin和end

cout

<< endl;

for(auto &iter : a) cout

<< iter << " ";//c++11迴圈區間:號相當於python的in關鍵字

cout

<< endl;

int b[5]=;

for(auto &iter : b) cout

<< iter << " ";//棧陣列支援迴圈區間用法

cout

<< endl;

int *c = new

int[5];

int tmp = 10;

generate(c,c+5,[&]());

copy(c,c+5, ostream_iterator(cout, " "));

//for(auto &iter : c) cout << iter << " ";//堆陣列不支援auto:迴圈

cout

<< endl;

上面展示了一種傳統遍歷方法和兩種c++11迴圈遍歷的新用法。新用法的第一種,iter1和iter2都是迭代器;第二種新用法,iter是直接指向容器元素的引用,不是迭代器。第二種用法**的執行效率和其他幾種用法差別不大,但是更加簡潔。如果上了c++11的專案,一般推薦使用第二種新用法。

C c 11中的隨機數 random

在 c 程式中,在新標準出現之前,c 和 c 都依賴乙個簡單的 c 庫函式rand來生成隨機數,但是,這個函式生成的是均勻分布的偽隨機數,每個隨機數的範圍在 0 和乙個系統相關的最大值 至少為 32767 之間。rand函式有一些問題 即使不是大多數,也有很多程式需要不通範圍的隨機數。一些應用需要隨...

C 20 模式下將啟用協程支援 CC 11

gcc 10 在 c 20 模式 std c 20 中執行時,預設情況下會啟用 c 協程。而將於明年發布的 gcc 11 在 c 20 推出時將具有協程功能,到那時,gnu 編譯器集合中支援 c 20 的剩餘部分也應該會被解決 協程 coroutines 是 c 20 的主要功能之一,它允許某個函式...

C 11中新特性 型別推導

c 11標準為c 程式語言的第三個官方標準,正式名叫iso iec 14882 2011 information technology programming languages c 在正式標準發布前,原名c 0x。它將取代c 標準第二版iso iec 14882 2003 programming ...