程式設計與演算法(三)第十週 c++新特性和c++高階主題 (2)
阿新 • • 發佈:2019-01-10
無序容器(雜湊表)
//雜湊表插入和查詢的時間複雜度幾乎是常數
#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