1.排序
sort(first,last,cmp)
first指向要排序范圍的第一個元素,從0起
last指向要排序范圍的最后一個元素的下一個位置
cmp(可選),自定義函數,默認從小到大
評測系統
#include <iostream>
#include<algorithm>
using namespace std;
bool cmp(int a, int b) {return a > b;//定義從大到小排序
}
int main()
{int n;cin >> n;long long int a[500005];for (int i = 0; i < n; i++) {cin >> a[i];}sort(a, a + n);//從小到大for (int i = 0; i < n; i++) {cout<< a[i]<<" ";}cout << endl;sort(a, a + n,cmp);//定義比較函數for (int i = 0; i < n; i++) {cout << a[i] << " ";}return 0;
}
2.最值查找
min和max只能傳入兩個值或一個列表
min(3,5)=3
min({1,2,3,4})=1
min_element(st,ed)
st到end(不含)中最小那個值的地址
[例]成績分析
評測系統
#include <iostream>
#include <algorithm>
#include <numeric>
#include <iomanip>
using namespace std;
int main()
{int n;cin >> n;int a[10005];for (int i = 0; i < n; i++) {cin >> a[i];}int* x = max_element(a, a + n); //#include <algorithm>cout << *x<<endl;x = min_element(a, a + n); //#include <algorithm>cout << *x<<endl;double sum = accumulate(a, a + n, 0); //#include <numeric>cout << fixed << setprecision(2) << 1.0*sum / n; //#include<iomanip>,*1.0確保是小數,這樣才能確保精度return 0;
}
3.二分查找
二分查找的庫函數只能處理數字式單調不減/單調不增的
(1)binary_search
頭文件#include <algorithm>
返回bool類型
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{int a[] = { 1,4,6,8,9 };//查找6,返回bool類型,成功1,失敗0cout << binary_search(a, a + 5, 6); // # include <algorithm>
}
(2)lower_bound
復雜度O(log n)
適用于單調不減的數組
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{int a[] = { 1,4,6,6,9 };//返回第一個大于等于6的地址cout<<lower_bound(a, a + 5, 6);// 000000DB0954F9C0//減去首地址,返回的是索引下標,即6第一次出現的位置cout << lower_bound(a, a + 5, 6)-a;// 2
}
(3)upper_bound
適用于單調不減的數組
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{int a[] = { 1,4,6,6,9 };//返回第一個大于6的地址cout<<upper_bound(a, a + 5, 6);// 000000010134FC58//減去首地址,返回的是索引下標cout << upper_bound(a, a + 5, 6)-a;// 4
}
[例] 二分查找數組元素,要求復雜度小于O(n)
解:數組中沒有相同元素,且是單調遞增的
#include <iostream>
using namespace std;
int main()
{int data[200];for (int i = 0; i < 200; i ++){data[i] = 4 * i + 6;}int n;cin >> n;cout<<lower_bound(data, data + 200, n)-data;//lower_bound得到的是地址,減去首地址data即為下標return 0;
}
4.大小寫轉換
#include <iostream>
using namespace std;
int main()
{char a = 'A';if (isupper(a)) {//isupper判斷是否是大寫字母,bool類型cout << tolower(a);//轉為小寫,ASCII類型。輸出:97cout << char(tolower(a));//ASCII轉字符。輸出:a}
}
對應的
判斷是否小寫(bool):islower
轉小寫(ASCII):tolower
當前,也可以用ASCII直接轉換,
a 97
A 65
相差32
#include <iostream>
using namespace std;
int main()
{char s = 'A';cout << char(s + 32);// a
}
5.全排列(排列組合)
只能處理初始有序的序列
(1)next_permutation
若初始是abc(這是最小的序列組合(在字符串比較中))
大一點acb
再大bac
再大bca
再大cab
最大cba
#include <iostream>
#include <algorithm>
using namespace std;
int main() {int a[3] = { 2, 5, 7 };do {for (int i = 0; i < 3; i++) {cout << a[i];}cout << endl;} while (next_permutation(a, a + 3));return 0;
}
輸出:
257
275
527
572
725
752
(2)prev_permutation
由大到小輸出,初始序列應為降序
#include <iostream>
#include <algorithm>
using namespace std;int main() {int a[3] = { 7, 5, 2 };do {for (int i = 0; i < 3; i++) {cout << a[i];}cout << endl;} while (prev_permutation(a, a + 3));return 0;
}
輸出:
752
725
572
527
275
257
6.其他庫函數
(1)memset
用于將一塊內存區域的每個字節都設置為特定的值,通常用于初始化內存塊
頭文件#include <cstring>
只能設置成0或-1
int a[3] = { 7,6,4 };
memset(a, 0, sizeof(a));//對a數組每個元素初始化0
(2)swap
交換兩個變量的值,變量值發生了改變
#include <iostream>
using namespace std;
int main() {int a = 1;int b = 2;swap(a, b);cout << a; //2return 0;
}
(3)reverse
翻轉數組,會修改數組元素值
#include <iostream>
using namespace std;
int main() {int a[5] = { 1,2,3,4,5 };reverse(a, a + 5);for (int i = 0; i < 5; i++) {cout << a[i];//54321}
}
(4)unique
去除相鄰重復元素
復雜度O(n)
#include <iostream>
#include <algorithm>
using namespace std;
int main() {int a[10] = { 1, 2, 2, 3, 3, 3, 4, 5, 5, 5 };int* b=unique(a, a + 10);//指針b指向了去重后的最后一個元素的下一個位置int n = b-a;//b-起始地址即為去重后數組的元素個數for (int i = 0; i < n; i++) {cout << a[i];//12345}
}