2016年10月26日 星期三

給新手的C++教學 (上冊) - 13 - 25. 「新版C++」--「C++11」的好用功能

回到「給新手的C++教學 (上冊)」

回到「13. 額外語法 (Extra syntax)」

上一頁

C++看起來已經是一個很完整、功能強大的程式語言了
但事實上,世界各地的專家們仍然致力於改善C++,讓原本已經很強的C++的功能更加強大!
因此,C++也是有版本的哦~
別擔心,您在較舊版本C++使用的語法,在新版C++也能無縫接軌的使用!

注意:請先依據這篇設定好編譯參數,才能使用本頁所教的語法

請注意,此篇語法有些適合搭配STL (Standard Library 標準函式庫) 使用,STL的介紹和用法將在下冊講到

「auto」的用法:

先備知識:1~12章的某些基本語法
功能:可以讓電腦在宣告變數的時候自動判斷該變數的型別

簡單舉例:

#include<cstdio>
int main()
{
    double a=8.3;
    //double b=a;
    auto b=a;//這一行和上面那一行被註解掉的程式碼是等價的 
    printf("a=%f, b=%f\n",a,b);
    return 0;
}
執行結果


再舉一個例子:



#include<cstdio>
struct DateOfKSHSFairs
{
    int month,day;
};
int main()
{
    DateOfKSHSFairs day1;
    day1.month=10;
    day1.day=28;
    //DateOfKSHSFairs day2=day1;
    auto day2=day1;//這一行和上面那一行被註解掉的程式碼是等價的 
    day2.day=29; 
    printf("高雄市立高雄高級中學園遊會\nday1=%d月%d日, day2=%d月%d日\n",day1.month,day1.day,day2.month,day2.day);
    return 0;
}
執行結果


如果還是看不懂怎麼用,歡迎發問~

「for迴圈」的另類用法:

先備知識:1~12章的某些基本語法
功能:大幅簡化枚舉陣列或STL容器 (vector、set、map......等等) 的元素的迴圈

簡單舉例:

陣列版本:

#include<cstdio>
int main()
{
    int s[6]={0,2,4,0,0,5};
    for(int element:s)
    {
        printf("%d\n",element);
    }
    return 0;
}
執行結果

vector版本:

#include<cstdio>
#include<vector>
using namespace std;
int main()
{
    vector<int>s;
    s.push_back(0);
    s.push_back(2);
    s.push_back(4);
    s.push_back(0);
    s.push_back(0);
    s.push_back(5);
    for(int element:s)
    {
        printf("%d\n",element);
    }
    return 0;
}
執行結果

set版本:

#include<cstdio>
#include<set>
using namespace std;
int main()
{
    set<int>s;
    s.insert(0);
    s.insert(2);
    s.insert(4);
    s.insert(0);
    s.insert(0);
    s.insert(5);
    for(int element:s)
    {
        printf("%d\n",element);
    }
    return 0;
}
執行結果

map版本:

#include<cstdio>
#include<map>
using namespace std;
int main()
{
    map<char,int>s;
    s['B']=1;
    s['0']=9;
    s['5']=9;
    s['9']=8;
    s['0']=0;
    s['2']=4;
    s['0']=0;
    s['8']=1;
    s['3']=1;
    //for(pair<char,int> element:s)
    for(auto element:s)//這一行和上面那一行被註解掉的程式碼是等價的
    /*看到auto了嗎?
      電腦將會自動把auto替換為pair<char,int>
      當你不知道element要用甚麼型別時特別好用*/
    {
        printf("key=%c, value=%d\n",element.first,element.second);
    }
    return 0;
}
執行結果

如果還是看不懂怎麼用,歡迎發問~

「匿名函式 (又稱Lambda、匿名運算式)」的用法:

先備知識:1~12章的某些基本語法
功能:可以在程式執行到一半的時候創造函式

簡單舉例:

#include<cstdio>
int main()
{
    auto Level=[](int a)->int
    {
        int answer=1;
        for(int i=1;i<=a;i++)answer=answer*i;
        return answer;
    };
    for(int x=1;x<=6;x++)
    {
        printf("%d! = %d\n",x,Level(x));
    }
    return 0;
}
執行結果

這樣寫可以在不用幫函式取名 (注意到程式碼中找不到「Level」) 的條件下達成一模一樣的效果,這就是為甚麼這種東西被稱為「匿名函式」(沒有名字的函式) 的原因:

#include<cstdio>
int main()
{
    for(int x=1;x<=6;x++)
    {
        printf("%d! = %d\n",x,[](int a)->int
        {
            int answer=1;
            for(int i=1;i<=a;i++)answer=answer*i;
            return answer;
        }(x));
    }
    return 0;
}
執行結果

這是以上兩個範例中匿名函式的本體:

[](int a)->int
{
    int answer=1;
    for(int i=1;i<=a;i++)answer=answer*i;
    return answer;
}

「中括號[]」寫出來放著就好
「小括號()」裡面放入引數 (甚麼是引數?)
「箭頭->」後面接回傳值 (甚麼是回傳值?) 的型別
「大括號{}」裡面放入函式的程式碼

就這樣
小中大括號都用到了耶!好記吧~XD

-----The End-----

關於C++11的好用語法就先介紹到這裡
如果還想要繼續更深入的研究,可以參考維基百科

下一頁 (這是最後一頁)

感謝:
(版權所有 All copyright reserved)

沒有留言:

張貼留言

歡迎留言或問問題~
若您的留言中包含程式碼,請參考這篇
如果留言不見了請別慌,那是因為被google誤判成垃圾留言,小莫會盡快將其手動還原

注意:只有此網誌的成員可以留言。