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 ...