# 常用函式複習 本篇複習筆記主要介紹C++中常用函式的使用方式。 ## math函式 以下函式皆在 c語言<math.h> c++<cmath> 標頭檔中定義 ### pow **pow(x,y)** 計算$$x^y$$之值。 ```cpp= #include<bits/stdc++.h> #define ll long long using namespace std; int main(){ double a,b; cin>>a>>b; cout<<pow(a,b)<<'\n'; return 0; } ``` ### sqrt **sqrt(x)** 計算x平方根之值。 ```cpp= #include<bits/stdc++.h> #define ll long long using namespace std; int main(){ double a; cin>>a; cout<<sqrt(a)<<'\n'; return 0; } ``` ### abs **abs(x)** 計算x之絕對值。 ```cpp= #include<bits/stdc++.h> #define ll long long using namespace std; int main(){ int a; cin>>a; cout<<abs(a)<<'\n'; return 0; } ``` ### __gcd **gcd(a,b)** 計算a,b之最大公因數。 ```cpp= #include<bits/stdc++.h> #define ll long long using namespace std; int main(){ int a,b; cin>>a>>b; cout<<__gcd(a,b)<<'\n'; return 0; } ``` ## algotithm函式 以下函式皆在 <algorithm> 標頭檔中定義 ### sort **sort( begin,end,cmp)** 從陣列的begin位置到end-1位置進行排列,排列方式為有小到大,可自行定義排列方式,時間複雜度為O(nlogn)。 ```cpp= #include<bits/stdc++.h> #define ll long long using namespace std; int a[100005]; vector<int> v(100005); bool cmp(int a,int b){ a>b; } int main(){ int n,x; cin>>n; for(int i=0;i<n;++i)cin>>a[i]; sort(a,a+n);//對array做排序 cin>>n; for(int i=0;i<n;++i)cin>>v[i]; sort(v.begin(),v.end());//對vector做排序 sort(a,a+n,cmp);//自定義排列 sort(a,a+n,[](int a,int b){ return a>b; });//以lambda函式自定義排列 return 0; } ``` ### max **max(a,b)** 會比較其參數中傳遞的兩個數字,並返回兩個中較大的一個,如果兩個相等,則返回第一個。 ```cpp= #include<iostream> #include<algorithm> using namespace std; int main() { //回傳較大之參數 cout << max(1,2) << "\n"; //多筆參數比對 cout<< max({1,2,3,4})<<'\n'; return 0; } ``` ### min **min(a,b)** 會比較其參數中傳遞的兩個數字,並返回兩個中較小的一個,如果兩個相等,則返回第一個。 ```cpp= #include<iostream> #include<algorithm> using namespace std; int main() { //回傳較大之參數 cout << min(1,2) << "\n"; //多筆參數比對 cout<< min({1,2,3,4})<<'\n'; return 0; } ``` ### fill ### lower_bound **lower_bound( begin,end,num,greater() )** 從陣列的begin位置到end-1位置二分查詢第一個大於或等於num的數字,找到返回該數字的地址,不存在則返回end,此陣列需經過排序使其具有單調性,時間複雜度為O(logn)。 ```cpp= #include<bits/stdc++.h> #define ll long long using namespace std; int a[100005]; int main(){ int n,x; cin>>n; for(int i=0;i<n;++i)cin>>a[i]; sort(a,a+n); cin>>x; cout<<lower_bound(a,a+n,x)-a<<'\n'; //通過返回的地址減去起始地址begin,得到索引值 return 0; } ``` ### upper_bound **upper_bound( begin,end,num,greater() )** 從陣列的begin位置到end-1位置二分查詢第一個大於num的數字,找到返回該數字的地址,不存在則返回end,此陣列需經過排序使其具有單調性,時間複雜度為O(logn)。 ```cpp= #include<bits/stdc++.h> #define ll long long using namespace std; int a[100005]; int main(){ int n,x; cin>>n; for(int i=0;i<n;++i)cin>>a[i]; sort(a,a+n); cin>>x; cout<<upper_bound(a,a+n,x)-a<<'\n'; //通過返回的地址減去起始地址begin,得到索引值 return 0; } ``` ### binary_search **binary_search( begin,end,num,greater() )**:從陣列的begin位置到end-1位置二分查詢num是否存在陣列中,找到返回True,不存在則返回False,此陣列需經過排序使其具有單調性,時間複雜度為O(logn)。 ```cpp= #include<bits/stdc++.h> using namespace std; int a[100005]; int main() { int n,x; cin>>n; for(int i=0;i<n;++i)cin>>a[i]; cin>>x; if(binary_search(a,a+n, x)) cout << "found" <<'\n'; else cout << "not found" <<'\n'; return 0; } ``` ## string 函式 ### memset ### memcpy