1. 程式人生 > >程式設計與演算法(三)第十週 c++新特性和c++高階主題 (2)

程式設計與演算法(三)第十週 c++新特性和c++高階主題 (2)

無序容器(雜湊表)

//雜湊表插入和查詢的時間複雜度幾乎是常數
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
    unordered_map<string, int> turingWinner;
    turingWinner.insert(make_pair("Dijsktra", 1972));
    turingWinner.insert(make_pair("Scott",
1976)); turingWinner.insert(make_pair("Wilkes", 1967)); turingWinner.insert(make_pair("Hamming", 1968)); turingWinner["Richie"]=1983; string name; cin>>name; unordered_map<string, int>::iterator p = turingWinner.find(name); if(p!=turingWinner.end()) cout<<
p->second; else cout<<"Not Found"<<endl; return 0; }

正則表示式

//正則表示式
#include <iostream>
#include <regex>
using namespace std;
int main()
{
    // b開頭跟0或1個字元再跟p再跟0個或多個相同字元再跟k
    regex reg("b.?p.*k");
    cout<<regex_match("bopggk",reg)<<endl;
    cout<<
regex_match("boopggk", reg)<<endl; cout<<regex_match("b pk", reg)<<endl; // \\d是\d代表0-9{3}代表出現前面的東西3次,()代表項,[a-zA-Z]+代表字母出現一次或者若干次 // 接上面。。。 .代表有任意一個字元,|代表或,\\s是空格,\1代表第一項,就是([a-zA-Z]+)了 regex reg2("\\d{3}([a-zA-Z]+).(\\d{2}|N/A)\\s\\1"); string correct="123Hello N/A Hello"; string incorrect="123Hello 12 hello"; cout<<regex_match(correct, reg2)<<endl; cout<<regex_match(incorrect, reg2)<<endl; }
1
0
1
1
0

Lambda表示式

只使用一次的函式物件,能否不要專門為其編寫一個類?

只調用一次的簡單函式,能否在呼叫時才寫出其函式體?

形式:

[外部變數訪問方式說明符](形參表)-> 返回值型別
{
語句組
}
[=] 以傳值的形式使用所有外部變數
[] 不使用任何外部變數
[&] 以引用形式使用所有外部變數
[x, &y] x 以傳值形式使用,y以引用形式使用
[=, &x, &y] x, y以引用形式使用,其餘變數以傳值形式使用
[&, x, y] x, y以傳值的形式使用,其餘變數以引用形式使用
“->返回值型別”也可以沒有,沒有則編譯器自動判斷返回值型別。

//lambda表達
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int x=100,y=200,z=300;
    cout<<[](double a, double b){return a+b;}(1.2, 2.5)<<endl;
    auto ff=[=, &y, &z](int n, int m){
        cout<<"x is:"<<x<<endl;
        y++;z++;
        return n*n;
    };
    // 注意,這裡如果是cout<<ff(15, 15)<<" "<<y<<","<<z<<endl;這樣的化,就是200,300了
    cout<<ff(15, 15)<<endl;
    cout<<" "<<y<<","<<z<<endl;
    // lambda 應用
    cout<<"************"<<endl;
    int a[4]={4,2,11,33};
    sort(a,a+4,[](int x, int y)->bool{return x%10<y%10;});
    for_each(a, a+4, [](int x){cout<<x<<" ";});
}
3.7
x is:100
225
 201,301
************
11 2 33 4 
//lambda表達
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    vector<int> a{1,2,3,4};
    int total=0;
    // 這個陣列每個元素求和,並且乘以2
    for_each(a.begin(), a.end(),[&](int &x){total+=x;x*=2;});
    cout<<total<<endl;
    for_each(a.begin(), a.end(), [](int x){cout<<x<<" ";});
    return 0;
}
10
2 4 6 8 
//lambda表示式遞迴求斐波那契數列
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
int main()
{
    // function<int(int)>表示一種型別,表示返回值為int,有一個int引數的函式
    // 下面表示對這個fib變數用lambda進行初始化,對於lambda來說,這個fib是外部變數,
    // 在這個lambda中,[&fib]表示要使用這個fib,而且是以引用的方式
    function<int(int)>fib=[&fib](int n)
    {return n<=2?1:fib(n-1)+fib(n-2);};
    cout<<fib(20)<<endl;
    return 0;
}
6765