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}
}